如何使用Simple Form Rails添加HTML属性以选择选项?

我需要为select控件的每个option添加自定义HTML属性。 我在Rails中使用simple_form。 有谁知道如何做到这一点? 该属性将由客户端JS使用。

例如,我想做这样的事情:

  

哪个会产生(简化):

  First Group Second Group Third Group  

@groups可能如下所示:

 [ ['First Group', 1, 'primary'], ['Second Group', 2, 'secondary'], ['Third Group', 3, 'secondary'] ] 

希望避免必须制作自定义控件/包装器。 谢谢!

你很亲密! 最简单的方法实际上不是在这里使用simple_form。 这是simple_form文档

 <% options = @group.map { |g| [g.name, g.id, {'data-type' => g.group_type}] } %> <%= f.input :group, label: 'Group' do %> <%= f.select :group, options, include_blank: 'Select a Group', class: 'form-control' %> <% end %> 

对于您的确切代码,它将是:

 <% options = @group.map { |g| [g[0], g[1], {'data-type' => g[2]}] } %> <%= f.input :group, label: 'Group' do %> <%= f.select :group, options, include_blank: 'Select a Group', class: 'form-control' %> <% end %> 

仅限简单forms:

= f.input :group, @groups.map{|l| [l[0], l[1], {data: {type: l[2]}}]}

使用f.input do end方法的一个(小)缺点是任何默认输入html选项(如简单forms的required类或optional类或required属性)和任何默认选项(如b.use :input, class: 'input-element'只是将一个块传递给f.inputtldr时缺少b.use :input, class: 'input-element':输入没有被装饰

如果你依赖这些额外的类和属性,你必须手动传递它们(不干)。

为了克服这个问题,我为我的特殊选择创建了一个自定义输入,所以我可以像我想要的那样定义我的选择的主体( 标签),但是select会像往常一样进行装饰:

 # app/inputs/select_container_input.rb class SelectContainerInput < SimpleForm::Inputs::Base def input(wrapper_options) options_html = input_options.delete(:options_html) # since we pass our options by our self (and have to select the correct # option), set `selected` to `''` to prevent rails calling # `object.send(attribute_name)` only to set `selected` which is not used. input_options[:selected] = '' merged_input_options = merge_wrapper_options(input_html_options, wrapper_options) @builder.select attribute_name, nil, input_options, merged_input_options do options_html end end end 

简单地称之为:

 <% options_html = capture do %>  <% end %> <%= f.input :attribute, as: :select_container, options_html: options_html %> 

options_html是一种解决方法,因为实际上将块传递给我们的自定义输入会更容易:

 <%= f.input :attribute, as: :select_container do %>  <% end %> 

但是由于SimpleForm :: FormBuilder#def_input的工作方式,在代码甚至触及输入之前,块被带走了。 所以没有重构simple_form就没有办法。

总而言之,这为您的特殊选择在视图中添加了一些额外的噪声代码解决了问题。

这似乎是这样做的正确方法:

Rails简单表单自定义关联选择字段