用作块时如何将类添加到 Rails 选择表单助手

use*_*525 5 ruby ruby-on-rails ruby-on-rails-3

Rails 选择表单帮助程序的文档说明(请参阅文档):

select(object, method, choices = nil, options = {}, html_options = {}, &block)
Run Code Online (Sandbox Code Playgroud)

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

<%= f.select :some_attr, MYOPTIONS, {}, {class: 'my-class'} %>
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何在将其用作块时向其添加类?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
Run Code Online (Sandbox Code Playgroud)

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

<%= f.select :some_attr, {}, {class: 'my-class'} do %>
  <% MYOPTIONS.each do |MYOPTION| do %>
    <%= content_tag :option, MYOPTION.label, value: MYOPTION.value %>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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

f.select :some_attr, class: 'my-class' do
Run Code Online (Sandbox Code Playgroud)

该类不适用于 HTML 中的 select 标记。

use*_*525 5

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

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

<%= f.select :some_attr, {}, {}, {class: 'my-class'} do %>
  <% MYOPTIONS.each do |MYOPTION| do %>
    <%= content_tag :option, MYOPTION.label, value: MYOPTION.value %>
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

第二个散列仍然optionshtml_options,最后一个仍然是,所以作为一个例子,你也可以include_blank像这样添加:

f.select :some_attr, {}, {include_blank: true}, {class: 'my-class'}
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*ies 5

需要注意的几个奇怪之处:

在您的示例中,您使用的是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 %>
Run Code Online (Sandbox Code Playgroud)

当提供块时,该块优先于文字值(在本例中为空散列)。

令人惊讶的是,如果您使用select_tag而不是渲染此标签f.select,则传递块将不是一个选项:

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