0

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

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

4

2 回答 2

0

如果您[]在调用中使用命名,collection_select则参数会将数据作为数组发送

我对 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

旁注:您可以在字符串连接的地方使用带有红宝石双引号的字符串+插值

<%= 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

于 2013-06-24T18:25:16.543 回答
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")

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

于 2013-06-24T18:25:55.080 回答