1. ホーム
  2. ruby-on-rails

[解決済み] ruby on rails f.select オプションとカスタム属性

2022-08-02 06:33:54

質問

フォームに以下のようなselect文があります。

= 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は、既存のoptions_for_selectヘルパーを使用して、選択オプションにカスタム属性を追加することができます。ご質問のコードでは、ほぼ正しく書かれていました。html5のdata-attributesを使用しています。

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

グループ化されたオプションが必要な場合は、次のように 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) %>

ドキュメントではなく、railsのソースを読んでこれを見つけたことを投稿したpaul @ pogodanに謝意を表するべきです。 https://web.archive.org/web/20130128223827/http://www.pogodan.com/blog/2011/02/24/custom-html-attributes-in-options-for-select