我在一个表单中有多个相同的集合选择。出于审美和用户体验的原因,我更倾向于选择多个列表。我必须使用一个可怕的kludge来使一切正常,我想知道是否有更优雅的方式来做到这一点:
从视图:
<% 3.times do |i| %>
<%= collection_select("selected_item_" + i.to_s.to_s, :name, @items, :name, :name, { :include_blank => true }, { id: "selected_item_" + i.to_s }) %>
<% end %>
来自控制器:
ItemContainer = Struct.new(:name)
3.times do |i|
param = ('selected_item_' + i.to_s).to_sym
instance_variable = '@' + param_name
if params[param] && !params[param].empty?
@selected_items << params[param][:name]
instance_variable_set(instance_variable, ItemContainer.new(params[param][:name]))
end
end
@selected_channels.each.... # do what I need to with these selections
如果刷新页面,大多数这些体操都需要确保仍然选择该项目。如果有某种方法强制收集选择使用数组,那将是答案,但我无法做到这一点。
答案 0 :(得分:0)
如果您在[]
调用中使用collection_select
命名,那么params将作为数组发送数据
我对这里的collection_select的使用有点困惑,因为它似乎不是你在使用模型对象?这个使用select_tag的例子 - 如果已知模型结构,可能能够提出更适合您的问题
# run this in the loop
# set selected_value to appropriate value if needed to pre-populate the form
<%= select_tag('name[]',
options_from_collection_for_select(@items, 'name', 'name', selected_value),
{ include_blank: true }
)
%>
控制器更新/创建操作中的
# this works because the select tag 'name' is named with [] suffix
# but you have to ensure it is set to empty array if none are passed, usually only issue with checkboxes
names = params[:name] || []
names.each do |name|
puts name
end
旁注:您可以在+
的位置使用带有ruby双引号的字符串插值进行字符串连接
<%= collection_select("selected_item_#{i}",
:name,
@items,
:name,
:name,
{ include_blank: true },
{ id: "selected_item_#{i}" }
)
%>
答案 1 :(得分:0)
如果我说得对,你正在寻找selegt_tag
方法(文档:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-select_tag)
你可以写这样的东西
select_tag "people[]", options_from_collection_for_select(@people, "id", "name")
select_tag "people[]", options_from_collection_for_select(@people, "id", "name")
它会为人们输出两个选项,这些选择将在提交时作为数组发送。