Ruby on Rails - f.select中的多个选择

Kim*_*Kim 53 ruby-on-rails

我的表单中有以下选择框:

Related Type: &nbsp; <%= f.select(:TYPE, [['Type A', 'Type A'],
                                  ['Type B', 'Type B'],
                                  ['Type C', 'Type C'],
                                  ['Type D', 'Type D'],
                                  ['Type E', 'Type E']
                                 ],{ :prompt => "Please select"}
                                 ) %>
Run Code Online (Sandbox Code Playgroud)

我想允许用户进行多项选择,并且还可以选择框5的大小.

如何为上面的代码执行此操作?

mik*_*kej 79

你的后{ :prompt => "Please select"}加用HTML选项例如,另一个哈希

<%= f.select(:TYPE, [['Type A', 'Type A'],
                                  ['Type B', 'Type B'],
                                  ['Type C', 'Type C'],
                                  ['Type D', 'Type D'],
                                  ['Type E', 'Type E']
                                 ],{ :prompt => "Please select"},
                                   { :multiple => true, :size => 5 }
                                 ) %>
Run Code Online (Sandbox Code Playgroud)

一旦你完成了这个,你可能想要移动你的:prompt选项({}尽管保持空,以便html属性不会被视为Rails选项.)

此外,您还需要确保控制器代码正确接受和处理多个值.

  • 为什么这会为存储在的每个未选择的选项添加"---"和" - ":TYPE? (6认同)
  • 当我将它保存在表单中时,它在位置 0 "ids" =&gt; [ [0] "", [1] "some_id" ] 处需要一个额外的空 "" (3认同)

小智 9

如果是收集,请尝试

    <%= f.select(:TYPE, Categories.collect {|p| [ p.name, p.id ] }, 
                                           { :prompt => "Please select"}, 
                                           { :multiple => true, :size => 5 }) %>
Run Code Online (Sandbox Code Playgroud)

  • 不应该是“Category.all.collect”吗? (2认同)

Aug*_*ger 8

我有一个完整的工作示例(包括编辑对象时的预选),时间:

  • Object 是被认为是对象
  • similar_ids 是关系的关键,是一个关键 string

形式如下:

form_for(@object) do |f|
  = f.select :similar_ids, options_from_collection_for_select(Object.all, :id, :name, {:selected => @object.similar_ids.split(';')}), {}, {:multiple => true, :size => 4, :name => 'object[similar_ids][]'}
Run Code Online (Sandbox Code Playgroud)

Object.rb模型中:

class Object < ActiveRecord::Base
  before_save :handle_similars

  def handle_similars
    self.similar_ids = self.similar_ids.select(&:present?).join(';') 
    # .select(&:present?) is necessary to avoid empty objects to be stored
  end

  def similars
    self.class.find(self.similar_ids.split(';'))
  end

end
Run Code Online (Sandbox Code Playgroud)

这些帖子帮助了我:

希望能帮助到你

  • 名称以“[]”结尾很重要,以便 Rails 将参数解释为值数组 (3认同)