Help us understand the problem. What is going on with this article?

collection_check_boxesメソッドの構造確認

More than 1 year has passed since last update.

はじめに

フォーム関連のビューヘルパーであるcollection_check_boxesメソッドの働きと構造を確認します。
本記事はこちらのQiita記事を元に、collection_check_boxesメソッドで自分が気になった点を調べ加筆したような形で執筆しています。
メソッドの構文確認に主眼を置いているので、ModelやControllerの記述に関する詳細は、上記の記事をご参照ください(細かいところまで説明がされており非常にわかりやすいです)。

Version

Ruby: 2.3.1
Rails: 5.0.1

やりたいこと

スクリーンショット 2017-01-29 21.19.34.png
Userを選択して新規にGroupを作成するためのコレクションボックスを作成する。

collection_check_boxes基本構文

views/groups/new.html.erb
<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>

この構文で
スクリーンショット 2017-01-29 20.43.54.png
こんな感じのコレクションチェックボックスが作成されます。

以下、コードの意味を一つ一つ確認していきます。

<%= 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を使って、多対多の関連をチェックボックスで設定する

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away