(メモ) rails などでの複数チェックボックスの挙動について: HTTP/HTML/form で何がおきているか

HTML/HTTP で同じ名前の input があった場合

HTML/HTTP のレイヤーでは、フォーム(form)中に同じ名前( name ) の input が複数個あった場合には、その個数分だけクエリパラメータが送信される。また、その順番は保存される。*1

同一の名前のクエリパラメータが複数飛んできた場合に、どのような処理を行うかはサーバー次第。

checkbox の挙動@HTML/HTTP: チェックされてなければ何も送らない

HTML/HTTP の段階では、 input のチェックボックス(checkbox)は、フォーム送信の際に、チェックがついていない場合には、クエリとしては何も送信されない。チェックのついていないチェックボックスは、それが存在しなかった場合と同じ挙動をする。

checkbox にデフォルトの挙動をもたせたい場合

PHP では、一つのフォームの中に同じ名前の input が複数個存在した場合には、後勝ちさせる仕様らしい。なので、チェックボックスのすぐ上に、隠れた(type=hidden の) input を用意することで、あたかもチェックがついていない場合には hidden の方の値でクエリで送付されているかのように振る舞わせることができる。
name の最後が [] であった場合には、PHP では同じ名前のクエリパラメータが束ねられて、配列としてソースコードに引き渡される。

rails も、PHP と同じような挙動をしている模様。*2