simple_form は form_for 以下のコードをすっきりさせるのによく使われると思います。
simple_form で data 属性ありの select ボックスの書き方がぱっと調べても出てこなかったので、メモしておきます。
動作確認したバージョン
- rails 5.1.5
- ruby 2.4.4
- simple_form 3.5.0
f.select で書く場合
simple_form を使わず通常の form_for で書く場合、options_for_select を使ってこのような形で書けます。
= f.select :name, options_for_select([ ['田中太郎', 1, data: {age: 20}], ['鈴木一郎', 2, data: {age: 30}] ])
生成される option の形はこのようになります。
<option data-age="20" value="1">田中太郎</option>
<option data-age="30" value="2">鈴木一郎</option>
simple_formの場合
色々試行錯誤したところ、この形でOKでした。collection: に options_for_select メソッドで指定していた引数をそのまま渡せばいいだけです。
= f.input :name, as: :select, collection: [ ['田中太郎', 1, data: {age: 20}], ['鈴木一郎', 2, data: {age: 30}] ]
少しコードを追って確認
後学のため、simple_form を f.input :name as: :select のような形で使う場合、なぜ collection の引数を options_for_select の引数と同じ形にできるのか、simple_form のコードをすこし追ってみます。
まずsimple_form で f.input :name as: :select という形で select ボックスを生成する時、rails の ActionView::Helpers::FormOptionsHelper モジュールの collection_select メソッドを呼んでいます。
このメソッドの引数の collection に [ ['田中太郎', 1, data: {age: 20}], ['鈴木一郎', 2, data: {age: 30}] ] が渡る形になります。
collection_select メソッドでは、 rails の ActionView::Helpers::Tags::CollectionSelect オブジェクトの render メソッドを呼んでいます。
render メソッドでは、ActionView::Helpers::FormOptionsHelper モジュールの options_from_collection_for_select メソッドを呼んでいます。
options_from_collection_for_select メソッドでは、ActionView::Helpers::FormOptionsHelper モジュールの options_for_select メソッドを呼んでいます。
このように一通り追ってみると、simple_form からも結局 options_for_select メソッドを呼んでいるので、options_for_select メソッドの引数の形で collection に指定しても動くということなのかなという理解をしました。