単一のチェックボックス
check_box_tag
単一のチェックボックスは下記のように記述します。label_tagと合わせて使用します。
1 2 |
<%= check_box_tag :パラメータ名 %> <%= label_tag :パラメータ名, "ラベル内容" %> |
check_box_tagの用途
モデルと紐づいていないform(form_tag)の場合に使われます。
checkbo_box
事前にマイグレーションファイルにboolean型でcheckboxを作成します。
1 |
t.boolean :checkbox |
viewファイルに下記のようにcheck_boxメソッドにてチェックボックスを定義します。
1 2 3 4 5 6 7 8 9 10 11 |
<%= form_with(model: モデル名, local: true) do |form| %> <div class="field"> <%= form.label :ラベル名%> <%= form.check_box :パラメータ名, id: :id属性の値%> </div> <div class="actions"> <%= form.submit %> </div> <% end %> |
DBには0(false:チェックなし) or 1(true:チェックあり)が登録されます。
check_boxの用途
モデルと紐づいているform(form_with、form_for)の場合に使われます。
初期値を設定する。
1 2 |
<%= form.label :ラベル内容 %> <%= form.check_box :パラメータ名, id: :id属性の値,checked:true %> |
「check:true」で可能です。
複数選択のチェックボックス
check_box_tag
マイグレーション側の設定
textを使います。
1 |
t.text :チェックボックスの格納先のカラム名 |
view側の設定
配列には、チェックボックスに渡す文字列の配列を定義します。
1 2 3 4 5 6 |
<% 配列.each.with_index do |配列の要素,i| %> <label> <%= check_box_tag 'モデル名[チェックボックスの格納先のカラム名][]', 配列の要素,false,id:"id_contents_#{i}"%> <%= ラベル名 %> </label> <% end %> |
controller側の設定
パラメータに配列として定義します。
1 |
params.require(:モデル名).permit(:name, :checkbox,チェックボックスの格納先のカラム名:[]) |
データベースの格納のされ方
text型のカラムに下記のように配列の値が格納されています。
1 |
["選択値1", "選択値2", "選択値3"] |
collection_check_boxes
チェックボックスの選択肢自体をテーブルに保存する場合はcollection_check_boxesというメソッドを使えば実装することが可能です。
ただし、画面から登録データを保存するためのテーブルとは別に、何を選んだか保存するための中間テーブル、選択肢自体を保存するテーブルの二つが必要になるのでテーブルが増えすぎることになります。その点には注意しましょう。
登録先テーブルのモデルの設定
1 2 3 4 |
class 画面の登録先テーブル < ActiveRecord::Base has_many :中間テーブル(複数形) has_many :チェックボックスの値保存先テーブル(複数形), :through => :中間テーブル(複数形) end |
チェックボックスの選択肢の保存先モデルの設定
1 2 3 4 |
class チェックボックスの選択肢保存先テーブル < ActiveRecord::Base has_many :中間テーブル(複数形) has_many :画面の登録先(複数形), :through => :中間テーブル(複数形) end |
ビューの設定
1 2 3 4 5 6 |
<div class="field"> <%= form.label :チェックボックス選択肢モデル %><br /> <%= collection_check_boxes(:画面の登録先モデル, :(チェックボックス選択肢モデル)_ids,チェックボックス選択肢モデル.all, :チェックボックス選択肢モデルのid(valueの値), :チェックボックス選択肢モデルのラベル名) do |b| %> <%= b.label { b.check_box + b.text } %> <% end %> </div> |
チェックボックス選択肢モデル)_ids:collection_check_boxesの第二引数
パラメータとして選ばれた選択肢をコントローラに配列として渡すための設定になります。
<%= form.label :チェックボックス選択肢モデル %><br />
別になくても構いませんが、あればチェックボックスの保存先であることをラベル表示しれくれます。
<%= b.label { b.check_box + b.text } %>
b.labelで囲うことによって「<label for="対応するid">各チェックボックス</label>」というHTMLが出力されるのでラベルをクリックしたらチェックボックスをつけるというように実装することが可能です。
コントローラ側の設定
1 2 3 |
def 画面の登録先モデル_params params.require(:画面の登録先モデル).permit(:name,チェックボックス選択肢モデル_ids:[]) end |
画面からは「チェックボックス選択肢モデル_ids」という配列が渡るのでStrong Parameterの設定で許可しておきます。
チェックボックスのバリデーション
check_box
選択肢の必須チェック
1 |
<%= form.check_box :パラメータ名, id: :id名,checked:true %> |
モデル側
1 |
validates :パラメータ名, presence: true |
検索すると「validates :admin, inclusion: {in: [true, false]}」にしないとfalseの時にエラーになると出てきますが、Rails6になったからでしょうかこれじゃないとむしろエラーになってしまいました。
collection_check_boxes
選択肢の必須チェック
1 2 3 |
<%= collection_check_boxes(:画面で登録するモデル名, :選択肢モデル_ids, 選択肢モデル.all, :id, :name) do |b| %> <%= b.label { b.check_box + b.text } %> <% end %> |
モデル側
1 |
validates :選択モデル_ids, presence: true |
この記事へのコメントはありません。