rails の grouped_options_for_select で selected を指定する方法


grouped_options_for_select に selected を指定したい

grouped_options_for_selectrailsドキュメントにはoptions_for_selectrails ドキュメントにある

<%= select_tag 'page[name]', options_for_select({"Railsの基礎" => "rails_base", "Rubyの基礎" => "ruby_base"}, :selected => "ruby_base") %>

# <select id="page_name" name="page[name]"><option value="rails_base">Railsの基礎</option>
# <option value="ruby_base">Rubyの基礎</option></select>

のような option に selected を指定するオプションはないようだ。

さてどうしたものか。。。

railsAPI を読んでみると...

https://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-grouped_options_for_select

ふむふむ、メソッドの引数に selected_key なるものを option の value を設定することでいけそうだ!

<%= select_tag 'page[name]', grouped_options_for_select([["基礎", [["Railsの基礎", "rails_base"], ["Rubyの基礎", "ruby_base"]]]], 'ruby_base') %>

# <select id="page_name" name="page[name]"><optgroup label="基礎"><option value="rails_base">Railsの基礎</option>
# <option value="ruby_base">Rubyの基礎</option></optgroup></select>

これで 「Rubyの基礎」が selected の状態になる!


できそうだなと思ったら粘り強く調べるべし

実のところ僕自身は rails ドキュメントに記載されていなかった時点でできないものだと思い諦めていたところ, 先輩エンジニアの方が協力してくれて見つけることができた。 options_for_select では普通に指定できるわけだし grouped_options_for_select だからできないというのは確かに違和感があった。次からは rails の素晴らしい機能を信じて深く探してみよう。