用作块时如何将 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
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