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

= f.select :country_id, @countries.map{ |c| [c.name, c.id] }

这导致了以下代码:

...
<option value="1">Andorra</option>
<option value="2">Argentina</option>
...

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

...
<option value="1" currency_code="XXX">Andorra</option>
<option value="2" currency_code="YYY">Argentina</option>
...

推荐答案

Rails可以使用现有的选项来添加自定义属性来选择选项.你的问题中的代码几乎是对的.使用html5数据属性:

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

添加初始选择:

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

如果需要分组选项,您可以使用分组的_选项_for _selecthelper,如下图所示(如果@continents是一组大陆对象,每个对象都有一个国家方法):

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

这应该归功于paul@pogodan,他发布了关于在文件中找到这一点的帖子,而是通过阅读rails源代码.https://web.archive.org/web/20130128223827/http://www.pogodan.com/blog/2011/02/24/custom-html-attributes-in-options-for-select

Ruby-on-rails相关问答推荐

您的Bundle 包被锁定为 mimemagic (0.3.5),但在 Gemfile 中列出的任何源中都找不到该版本

Dotenv 多行变量

安装mysql2(0.4.8)时出错,Bundler无法继续

Rails data-disable-with re-enable 按钮

控制器规格与请求规格?

如何在服务器启动时修复“您的 Ruby 版本是 2.3.0,但您的 Gemfile 指定了 2.2.5”

Rails 5 API 控制器中未定义的实例方法“respond_to”

Rails: Sprockets::Rails::Helper::AssetNotPrecompiled 在开发中

不允许请求来源:使用 Rails5 和 ActionCable 时的 http://localhost:3001

":nothing" 选项已弃用,将在 Rails 5.1 中删除

Ruby - 合并两个数组并删除重复的值

Rails 与多个外键的关联

当 AWS 存在时,为什么人们会使用 Heroku? Heroku 与 AWS 的区别是什么?

迁移:t.references 不允许指定索引名称

ActiveRecord::Base:Class 的未定义方法 raise_in_transactional_callbacks=' (NoMethodError)

Rails 迁移:add_reference 到表,但外键的列名与 Rails 约定不同

如何使用 Rspec 判断 ActiveJob 中排队的内容

从 ActiveRecord 模型中获取特定属性

搭建脚手架时建立关系

rails 4中secret_key_base的用途是什么