Rails中表单中的多个相同的collection_select标记

时间:2013-06-24 17:57:38

标签: ruby-on-rails ruby-on-rails-3

我在一个表单中有多个相同的集合选择。出于审美和用户体验的原因,我更倾向于选择多个列表。我必须使用一个可怕的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

如果刷新页面,大多数这些体操都需要确保仍然选择该项目。如果有某种方法强制收集选择使用数组,那将是答案,但我无法做到这一点。

2 个答案:

答案 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}" }
  ) 
%>

另见:http://apidock.com/rails/v3.2.13/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

答案 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")

它会为人们输出两个选项,这些选择将在提交时作为数组发送。