当用作块时,如何向Rails添加类选择表单助手

时间:2016-05-08 00:27:51

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

Rails的文档选择表单助手状态(see documentation):

select(object, method, choices = nil, options = {}, html_options = {}, &block)

这允许添加一个简单的类,如下所示:

<%= f.select :some_attr, MYOPTIONS, {}, {class: 'my-class'} %>

我的问题是,如何在将其用作块时为其添加类? Rails文档说明:

select(report, "campaign_ids") do
  available_campaigns.each do |c|
    content_tag(:option, c.name, value: c.id, data: { tags: c.tags.to_json })
  end
end

当我像这样使用它时它不起作用:

<%= f.select :some_attr, {}, {class: 'my-class'} do %>
  <% MYOPTIONS.each do |MYOPTION| do %>
    <%= content_tag :option, MYOPTION.label, value: MYOPTION.value %>
  <% end %>
<% end %>

如果我使用它也不起作用:

f.select :some_attr, class: 'my-class' do

该类未应用于HTML中的select标记。

2 个答案:

答案 0 :(得分:4)

我解决了自己的问题,虽然我不完全理解答案,所以如果其他人更了解这一点,我很乐意听到你的回答。

为了让它工作,我只是在开头添加了一个额外的空哈希,如下所示:

options

第二个哈希值仍为html_options,最后一个哈希值仍为include_blank,因此,您也可以像这样添加f.select :some_attr, {}, {include_blank: true}, {class: 'my-class'}

{{1}}

但是,我不知道第一个哈希是什么,也不知道那里可以传递什么值。我查看了Rails源代码,但我仍然没有任何线索。如果您对此有所了解,我很乐意听到它。

答案 1 :(得分:1)

要注意几个奇怪的事情:

在您的示例中,您使用f.select,您可以在此处找到参考: https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/select

只需要第一个参数,其余参数都有默认值。但是,要分配该HMTL类,您必须具有第四个参数的值,这也需要为第二个和第三个参数提供一些内容。

您最终得到的是一个有效的解决方案:

<%= f.select :some_attr, {}, {}, {class: 'my-class'} do %>
  <% MYOPTIONS.each do |MYOPTION| do %>
    <%= content_tag :option, MYOPTION.label, value: MYOPTION.value %>
  <% end %>
<% end %>

提供的块优先于文字值(在这种情况下为空哈希)。

令人惊讶的是,如果您使用select_tag代替f.select呈现此代码,则传递一个区块将不是一个选项:

https://apidock.com/rails/ActionView/Helpers/FormTagHelper/select_tag