是否可以为collection_select添加其他选项?

时间:2014-08-14 19:05:42

标签: ruby-on-rails ruby-on-rails-4

我目前有这样的事情(HAML):

 =form_for @users do |u|
   %p=u.label :name
   %p=u.text_field :name
   %p=u.label :surname
   %p=u.text_field :surname
   %strong='Section'
   =u.collection_select(:section_id, Section.all, :id, :name)

如何在collection_select中添加一个不仅仅是空值的附加选项?如果我使用“:prompt =>'请选择一个选项'”这只会在select的顶部添加提示,但如果我想添加类似“None”的值为“5”的内容怎么办?像这样:

 <option value="5">None</option>
 <option value="1">One</option>
 <option value="2">Two</option>

我的印象非常简单,我看不到它。

2 个答案:

答案 0 :(得分:2)

看起来您的特殊选项是id为5且名称为“None”的部分。这意味着您可以将其添加到数据库中所有部分的数组中。您可能应该在控制器操作中执行此操作:

@sections = []
@sections << Section.new(id: 5, name: "None")
@sections += Section.all

然后在您的视图中使用它。

= u.collection_select(:section_id, @sections, :id, :name)

答案 1 :(得分:0)

您可以通过自定义帮助方法实现它,例如:

def custom_section_collection_select
  section_options = []
  Section.each do |sec|
    section_options << content_tag(:option, "#{sec.name}", value: sec.id)
  end
  section_options << content_tag(:option, "None", value: "5")
  section_options # return value
end

然后在视图中调用:

= u.custom_section_collection_select

注意 建议不要使用硬编码值(如5或任何其他内容),就像创建可能具有相同ID的部分一样。

<强> 更新

def custom_collection_select(model, text, val, with_default)
  options = []
  model.to_s.classify.constantize.each do |rec|
    options << content_tag(:option, "#{rec.send(text)}", value: rec.send(val))
  end
  options << content_tag(:option, "None", value: "5") if with_default
  options # return value
end

然后在视图中:

= u.custom_collection_select("section", :name, :id, true)