我是Rails的新手,我正在努力实现具有多个选择的Select2输入。我读过StackOverflow上的解决方案,但没有一个对我有帮助,这通常意味着我做错了什么。
当我提交表单时,它会多次发送带有不同值的federation_list参数(在页眉中):
event[federation_list]: WDC
event[federation_list]: WDSF
我需要用逗号分隔一个Federation参数中的所有值,然后我可以在控制器中拆分这些值。
我试着按照Select2文档中的说明添加name: "federation_list[]"
,但我的form_with覆盖了它,所以它失去了括号。
已更新!我找到了解决方案,这是我的工作代码:
select2_initializer.js
$( document ).on('turbolinks:load', function() {
$( "#event_federation_list" ).select2({
theme: "bootstrap",
multiple: true,
placeholder: 'Select Federation(s)',
width: 'style'
}).val('').trigger('change');
});
_form.html.erb
<div class="form-group">
<%= form.label :federation_list, value: "Federations", class: "form-label" %>
<%= form.select :federation_list, options_from_collection_for_select(Federation.all, :id, :name, {:selected => @event.federations.map(&:id)}), {}, { multiple: true } %>
</div>
:selected使所选选项在用户编辑表单时显示。
event.rb
def federation_list
self.federations.map(&:name).join(', ')
end
def federation_list=(names)
self.federations = names.split(',').map do |n|
Federation.where(name: n.strip).first_or_create!
end
end
如果是相关信息,则我的事件有一个名称:联合,通过:Event_Federations。
GitHub代表
我最终选择了Selectize而不是Select2,但Select2的解决方案仍然适用。
然后我在事件.rb:中写了这段代码
def federation_list
self.federations.map(&:name).join(', ')
end
def federation_list=(ids)
self.federations = ids.reject!(&:empty?).map do |id|
Federation.where(id: id).first
# Use .first_or_create! to let the user add new objects
end
end
我使用了StevenTurczyns建议,并在我的strong参数中添加了联邦列表:[]。
这很管用!
不确定这是否是您唯一的问题,但一个明确的问题是,强参数要求您显式指定模型参数是否为数组。
代替
params.require(:event).permit(:title, :country,
:city, :start_date, :end_date, :published_at, :user_id,
:federation_list)
你应该有
params.require(:event).permit(:title, :country,
:city, :start_date, :end_date, :published_at, :user_id,
federation_list: [])