【问题标题】:Is it possible to add an additional option to a collection_select?是否可以向 collection_select 添加附加选项?
【发布时间】:2014-08-14 19:05:41
【问题描述】:

我目前有这样的东西(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 => '请选择一个选项'”,这只会在选择的顶部添加提示,但是如果我想添加值为“5”的“无”之类的内容怎么办?像这样:

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

我觉得这非常简单,但我看不到。

【问题讨论】:

  • 您可以通过在 helper 中添加代码来实现它。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 做到了。我知道这很简单。最后一件事,是否可以将其保留为 ActiveRecord 而不是散列变量?
  • 您的意思是保持 ActiveRecord 关系,以便您可以像@sections.where(foo: "bar").order(:name) 一样应用 SQL?那是不可能的。当您拥有最终部分列表时,您必须在最后一步应用它。它不必在控制器中,可以在辅助方法中完成。
【解决方案2】:

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

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)

【讨论】:

  • 5 的值只是一个例子。这是一个来自数据库的变量值,但这是最简单的解释方式。
  • 酷...我提供的示例仅适用于Section,但您可以轻松使其更通用。
  • 有趣。我已经将另一个建议标记为正确答案,但我会看看你的。也许我可以把它应用到别的东西上。是的,我可能会让它更通用。在我的示例中,选择列表通常有 10 个左右的选项,但我想包括一个不时需要的选项,它不一定在同一个表中。如果它是否被硬编码,这并不是什么大问题,因为该值不会发生太大变化(如果有的话)。
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 2019-06-07
  • 2016-01-30
相关资源
最近更新 更多