Railsでcheck_box_tagの動作にはまる

Railsで開発中にcheck_box_tagの動作に少しはまってしまったのでまとめました。環境は以下の通りです。

[bash] $ ruby -v ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]

$ rails -v Rails 4.1.1

[/bash]

事象

現在開発中のプロジェクトで、検索条件に過去データを含めるチェックボックスを追加しようとしました。内容は非常に単純で、Ransackで検索している検索条件のform内にcheckboxを追加したものです。

実際に画面はさくっとできたわけですが、実行してみると返却されるリクエストパラメーターが飛んできたり飛んでこなかったりしてちぐはぐな感じになりました。

ということで挙動について整理してみることにしました。

挙動を確認する

以下のような view helper がどのようなリクエストパラメーターを返却するかを確認します。

rails console でview helper の内容を出力していますが、次のサイトを参考にしました。ありがとうございます。

View Helper の動作を rails console で確認する - u16suzuの blog

対象となる view helper

対象となる view helperは以下のものとなります。checkboxの value が true で初期表示からチェックされている状態です。

[ruby] >> helper.check_box_tag 'hist_data_flg', true ,true "<input checked="checked" id="hist_data_flg" name="hist_data_flg" type="checkbox" value="true" />" [/ruby]

画面からcheckつけられた場合とそうでない場合でコントローラーで受け取る引数の結果を確認しますが結果は以下の通りとなりました。

画面でチェックがつけられた場合

[ruby] params['hist_data_flg'] => true [/ruby]

画面でチェックがつけられなかった場合

[ruby] params['hist_data_flg'] => nil [/ruby]

次に、valueに設定する値を true ではなく 'checked' に変更してみます。

[ruby] >> helper.check_box_tag 'hist_data_flg', 'checked' ,true "<input checked="checked" id="hist_data_flg" name="hist_data_flg" type="checkbox" value="checked" />" [/ruby]

同様に画面からcheckつけられた場合とそうでない場合でコントローラーで受け取る引数の結果を確認します。

画面でチェックがつけられた場合

[ruby] params['hist_data_flg'] => 'checked' [/ruby]

画面でチェックがつけられなかった場合

[ruby] params['hist_data_flg'] => nil [/ruby]

という結果となります。つまるところ、リクエストパラメーターはチェックボックスのチェック状態によって送信されていました。

まとめ

まとめると、check_box_tag は

checkboxにチェックがついている場合のみ input タグの value をパラメーターとして返却する

ということになります。

理解できれば当たり前のことなのですが、valueの値を動的に変更することばかり考えていたのでややこしく考えすぎていました。