はじめに
フォーム関連のビューヘルパーであるcollection_check_boxesメソッドの働きと構造を確認します。
本記事はこちらのQiita記事を元に、collection_check_boxesメソッドで自分が気になった点を調べ加筆したような形で執筆しています。
メソッドの構文確認に主眼を置いているので、ModelやControllerの記述に関する詳細は、上記の記事をご参照ください(細かいところまで説明がされており非常にわかりやすいです)。
Version
Ruby: 2.3.1
Rails: 5.0.1
やりたいこと
Userを選択して新規にGroupを作成するためのコレクションボックスを作成する。collection_check_boxes基本構文
<div class="check_box" >
<%= form_for @group do |f| %>
<%= f.collection_check_boxes(:user_ids, User.all, :id, :name) do |b| %>
<%= b.label { b.check_box + b.text } %>
<% end %>
<% end %>
</div>
この構文で
こんな感じのコレクションチェックボックスが作成されます。
以下、コードの意味を一つ一つ確認していきます。
<%= form_for @group do |f| %>
純粋なform_forの記述。"f"="@group"。
<%= collection_check_boxes(:group, :user_ids, User.all, :id, :name) do |b| %>
collection_check_boxesの中には、5つ引数がセットされている。
:group (第1引数)
:オブジェクト(form_forブロック配下では省略可能。詳細は下記)
:user_ids (第2引数)
:メソッド(プロパティ?)
:User.all (第3引数)
:inputタグの元となるオブジェクト配列。配列の数だけinputタグが作成される
:id (第4引数)
:作成されたinputタグのvalueとなる値を指定。今回の場合、各userのidが入力される
:name (第5引数)
:作成されたinputタグのテキストとなる値を指定。今回の場合、各userのnameが入力される
|b|
: 後述するbuilderに関係するもの?
第2引数がなぜ存在するのか、まだぼやっとしか理解できていませんが、イメージとしては
:user_ids (第2引数)
:チェックされたUserのidを処理するのに必要?
:User.all (第3引数)
:存在するUser全てのチェックボックスを作成するために必要。
こんな感じでしょうか。
<%= b.label { b.check_box + b.text } %>
次にこの部分。正直よくわからない。API dockによると、
The argument passed to the block is a special kind of builder for this collection, which has the ability to generate the label and check box for the current item in the collection, with proper text and value. Using it, you can change the label and check box display order or even use the label as wrapper, as in the example above.
引用元:Api dock
つまりは、ラベルとチェックボックス(今回の場合は+テキスト)を作成してくれる特別なbuilderとやらだそう。知識不足で現段階でよくわからないのだが、builderとやらが何かをしているみたい。
余談だが、このcollection_check_boxはいろんな部分が省略できる。
① collection_check_boxの第1引数は省略可能
<%= f.collection_check_boxes(:user_ids, User.all, :id, :name) do |b| %>
f = @groupのように考えられるので、fを先頭につける場合はオブジェクト(今回はgroup)を省略可能
<%= collection_check_boxes(:group, :user_ids, User.all, :id, :name) do |b| %>
fをつけない場合は第1引数にセットしてあげる
②<%= b.label { b.check_box + b.text } %>は丸ごと省略可能
省略しても自動で補ってくれる模様。ちなみに省略する場合は、do |b|
を削除するのを忘れずに。
#参考記事
・railsで多対多な関係を実装する時のポイント(加筆修正するかも)
・Rails4でcollection_check_boxesを使って、多対多の関連をチェックボックスで設定する