用作块时如何将 class 添加到 Rails select 表单助手

How to add class to Rails select form helper when using as a block

Rails select 表单助手的文档说明 (see documentation):

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

这允许添加一个 class 简单的,像这样:

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

我的问题是,如何在将它用作块时向其添加 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

class 未应用于 HTML 中的 select 标记。

我解决了我自己的问题,虽然我不完全理解答案,所以如果其他人对此理解得更好,我很想听听你的答案。

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

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

第二个哈希仍然是options,最后一个哈希仍然是html_options,所以举个例子,你也可以像这样添加include_blank

f.select :some_attr, {}, {include_blank: true}, {class: 'my-class'}

但是,我不知道第一个散列是什么,也不知道那里可以传递什么值。我查看了 Rails 来源,但我仍然没有头绪。如果您对此有深入的了解,我很想听听。

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

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

只有第一个参数是必需的,其余的都有默认值。但是,要分配该 HMTL class,您必须为第四个参数指定一个值,这也需要为第二个和第三个参数指定值。

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

<%= 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