ruby on rails f.select具有自定义属性的选项

el_*_*ick 112 select attributes ruby-on-rails

我有一个表单选择语句,如下所示:

= f.select :country_id, @countries.map{ |c| [c.name, c.id] }
Run Code Online (Sandbox Code Playgroud)

这导致以下代码:

...
<option value="1">Andorra</option>
<option value="2">Argentina</option>
...
Run Code Online (Sandbox Code Playgroud)

但我想在我的选项中添加自定义HTML属性,如下所示:

...
<option value="1" currency_code="XXX">Andorra</option>
<option value="2" currency_code="YYY">Argentina</option>
...
Run Code Online (Sandbox Code Playgroud)

Ana*_*use 351

Rails可以使用现有的options_for_select帮助程序添加自定义属性以选择选项.你几乎在问题的代码中正确使用它.使用html5数据属性:

<%= f.select :country_id, options_for_select(
    @countries.map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] }) %>
Run Code Online (Sandbox Code Playgroud)

添加初始选择:

<%= f.select :country_id, options_for_select(
    @countries.map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] }, 
    selected_key = f.object.country_id) %>
Run Code Online (Sandbox Code Playgroud)

如果需要分组选项,可以使用grouped_options_for_select助手,如下所示(如果@continents是一个大陆对象数组,每个都有一个countries方法):

<%= f.select :country_id, grouped_options_for_select(
    @continents.map{ |group| [group.name, group.countries.
    map{ |c| [c.name, c.id, {'data-currency_code'=>c.currency_code}] } ] }, 
    selected_key = f.object.country_id) %>
Run Code Online (Sandbox Code Playgroud)

应该归功于paul @ pogodan,他发布的不是在文档中发现这个,而是通过阅读rails来源. https://web.archive.org/web/20130128223827/http://www.pogodan.com/blog/2011/02/24/custom-html-attributes-in-options-for-select


Nik*_*pte 6

你可以这样做:

= f.select :country_id, @countries.map{ |c| [c.name, c.id, { 'data-currency-code' => c.currency_code} ] }
Run Code Online (Sandbox Code Playgroud)


Pan*_*kos 5

这不可能直接使用Rails,您必须创建自己的帮助程序来创建自定义属性.也就是说,有两种不同的方法可以实现您的目标:

(1)在HTML5中使用自定义属性名称.在HTML5中,您可以拥有自定义属性名称,但必须预先设置"data-".这些自定义属性不会随表单一起提交,但可以用来在Javascript中访问您的元素.如果你想完成这个,我建议你创建一个帮助器,生成如下选项:

<option value="1" data-currecy-code="XXX">Andorra</option>
Run Code Online (Sandbox Code Playgroud)

(2)使用自定义拆分值来提交其他数据.如果您确实想提交货币代码,我建议您创建如下所示的选择框:

= f.select :country_id, @countries.map{ |c| [c.name, "#{c.id}:#{c.currency_code}"] }
Run Code Online (Sandbox Code Playgroud)

这应该生成如下所示的HTML:

<option value="1:XXX">Andorra</option>
<option value="2:YYY">Argentina</option>
Run Code Online (Sandbox Code Playgroud)

然后您可以在控制器中解析:

@id, @currency_code = params[:country_id].split(':')
Run Code Online (Sandbox Code Playgroud)

  • >>>>>>>>>>>>>错误的答案......保持滚动<<<<<<<<<<<< (23认同)
  • 很好的答案.我选择了第1号方法并在博客上写了我如何帮助其他人.http://www.redguava.com.au/2011/03/rails-3-select-list-items-with-custom-attributes/ (3认同)