Railsのcheck_boxのチェック時、アンチェック時にどんな値がサーバに送られるか

1. デフォルト

<%= f.check_box :remember_me %>

HTML

<input name="session[remember_me]" type="hidden" value="0”>
<input type="checkbox" value="1" name="session[remember_me]" id="session_remember_me”>

チェックon時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar
  remember_me: '1'

チェックoff時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
email: foo@bar.co.jp
password: foobar
remember_me: '0'

2. true / false

<%= f.check_box :remember_me, {} , true, false %>

HTML

<input type="checkbox" value="true" name="session[remember_me]" id="session_remember_me”>

チェックon時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar
  remember_me: 'true'

チェックoff時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar

3. 1 / nil

<%= f.check_box :remember_me, {} , 1, nil %>

HTML

<input type="checkbox" value="1" name="session[remember_me]" id="session_remember_me”>

チェックon時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar
  remember_me: '1'

チェックoff時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar

4. "true", "false"

<%= f.check_box :remember_me, {} , "true", "false" %>

HTML

<input name="session[remember_me]" type="hidden" value="false”>
<input type="checkbox" value="true" name="session[remember_me]" id="session_remember_me”>

チェックon時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar
  remember_me: 'true'

チェックoff時のparameters

parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  email: foo@bar.co.jp
  password: foobar
  remember_me: 'false'

まとめ

  • Railsのcheckboxヘルパーは、文字列の値しか送らない(故にtrue / falseを送れない)

  • 値を指定しない場合は、チェックonで'1'、チェックoffで'0'が送られる

  • 文字列以外の値を指定した場合は、 チェックon時のHTMLのみが生成され、値は文字列変換されるチェックoff時の値はparameterに送られない

  • 上記の性質を利用して、有意味な区分値を埋め込んで送信したり、オンオフをnil?やpresent?などでシンプルで判定するためにあえてチェックoffの値を送らないように設定するといった工夫ができる