プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Ruby on Rails3、フォームヘルパーの「check_box」を使うときの注意点
Railsさんではviewにチェックボックスを配置するときに

  <%= f.check_box :hoge %>

とか書けるわけですが、地味に気を付けないといけません。

何に気を付ける必要があるのか?

それはフレームワークさんの宿命
「小さな親切大きなお世話」にです(--)b

要は

  <%= f.check_box :hoge %>

と書くと展開されるHTMLは

  <input name="hoge[hoge]" type="hidden" value="0" />
  <input name="hoge[hoge]" type="checkbox" value="1" />

になります。
そーです。hiddenタグも勝手に生成されちゃうのです。

これはcheckboxの未選択時に0が送信されるよう
Railsさんが気を利かしてくれた結果です。

checkboxって未選択時には項目自体送信されないですからね。
わぁ、親切ぅ(人´∀`)

……なのですがcheckしたときに0を送りたくて

  <%= f.check_box :hoge, {}, '0' %>

とか書くと

  <input name="hoge[hoge]" type="hidden" value="0" />
  <input name="hoge[hoge]" type="checkbox" value=
"0" />

に展開されて選択/未選択問わず0が送られちゃいます。

えっ?「そんなアホなことしねーよ!」ですか?
マスタや設定ファイルから動的にチェックボックスを生成したりすると
うっかりするかもしれないじゃないですかぁ(-ε-)ぶぅ
内部管理の値を1から始めて加算する人もいれば0から始める人もいるのが
悩ましい現実ですよ。いやマジで。

じゃあチェックしたときに0を送るにはどうすれば良いのか?

「check_box」は第四引数に未選択時の値を定義できるので

  <%= f.check_box :hoge, {}, '0', '-1' %>

とか書いて

  <input name="hoge[hoge]" type="hidden" value="-1" />
  <input name="hoge[hoge]" type="checkbox" value=
"0" />

にするしかないんじゃないですかね(^^;
もしくは「check_box_tag」をこねくり回して頑張るか。
「check_box_tag」だとhiddenタグは自動的に付与されないようです。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:Ruby on Rails  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事