微炭酸ログ

Ruby や Rails を中心に。

【Rails】Railsでoptgroupタグを実装する(セレクトボックスのグループ化)

先日の記事で grouped_options_for_select メソッドがいいと書きました。

tsubasashida.hatenablog.jp

しかし今日、テストデータを作るがてら実際に作ったフォームで適当に入力作業をしていたところ、欠陥があることに気づきました。

 

入力したはずのデータがセレクトボックスの初期値に表示されないのです。

<div class="form-group">
<%= form.label :round, 'ラウンド' %>
<%= form.select :round, grouped_options_for_select([['リーグ戦', ['第一節', '第二節']],
['トーナメント', ['一回戦', '二回戦', '準々決勝', '準決勝', '決勝']],
['入替戦', ['第一戦', '第二戦', '第三戦']]]),
{include_blank: '選択してください'}, class: 'form-control' %>
</div>

↑実装

↓画面表示(一回データ入力した後の状態)

f:id:tsubasashida:20181019000826p:plain

コンソールで見ると、データは更新されており、詳細画面などでも実際に更新後の値が表示されています。

GameInfo Update (0.8ms) UPDATE `game_infos` SET `round` = '第二節', `updated_at` = '2018-10-18 15:01:35' WHERE `game_infos`.`id` = 1

 

ただ、再度編集画面に遷移すると、セレクトボックスには「選択してください」の文字が…。

 

これでは意味がありません。しかもこのまま更新ボタンを押すと、データが空文字で更新されてしまうという…。全然ダメでした。grouped_options_for_select はこの場合使わないようにしないといけません。

 

ググっても対策が見つからなかったのですが、とりあえずそのまま配列を渡してみました。

(grouped_options_for_select メソッドを取っただけです)

<div class="form-group">
<%= form.label :round, 'ラウンド' %>
<%= form.select :round, [['リーグ戦', ['第一節', '第二節']],
['トーナメント', ['一回戦', '二回戦', '準々決勝', '準決勝', '決勝']],
['入替戦', ['第一戦', '第二戦', '第三戦']]],
{include_blank: '選択してください'}, class: 'form-control' %>
</div>

 

するとうまくいきました。更新した値が、再遷移した際にセレクトボックスに初期表示されました。もちろん、optgroupタグも同じように実現できています。

<select class="form-control" name="game_info[round]" id="game_info_round">
<option value="">選択してください</option>
<optgroup label="リーグ戦">
<option value="第一節">第一節</option>
<option value="第二節">第二節</option>
</optgroup>
<optgroup label="トーナメント">
<option value="一回戦">一回戦</option>
<option value="二回戦">二回戦</option>
<option value="準々決勝">準々決勝</option>
<option value="準決勝">準決勝</option>
<option value="決勝">決勝</option>
</optgroup>
<optgroup label="入替戦">
<option value="第一戦">第一戦</option>
<option value="第二戦">第二戦</option>
<option value="第三戦">第三戦</option>
</optgroup>
</select>

 

そうなると、grouped_options_for_select メソッドの用途がよくわからないです。古いバージョンのときのメソッドなのでしょうか…。

 

先が思いやられますが、焦りながらも頑張っていきます。