Railsで多対多のつながりのあるデータをチェックボックスとしてformに表示する
はじめに
例えばアンケートなんかで「興味のある事にチェックしてください(複数可)」のようなフォームがあった場合に、アンケートテーブルと興味のある事テーブルを連携させるやり方について。railsではcollection_check_boxes
というヘルパーを使うと簡潔に書くことができます。
モデル
アンケート(Questionnaire)と興味のある事(Hobby)にアソシエーションを設定します。中間テーブルとしてhobby_questionnaires
を使用するhas_many :through
を指定しています。
# app/models/questionnaire.rb
class Questionnaire < ActiveRecord::Base
has_many :hobby_questionnaires
has_many :hobbies, :through => :hobby_questionnaires
end
# app/models/hobby.rb
class Hobby < ActiveRecord::Base
has_many :hobby_questionnaires
has_many :questionnaries, :through => :hobby_questionnaires
end
ビュー
# app/views/questionnaries/_form.html.erb
・・・省略
<div class="form-group">
<%= form.label :hobbies, class: 'col-sm-2 control-label' %>
<div class="col-sm-10">
<div class="checkbox">
<%= collection_check_boxes(:questionnarie, :hobby_ids, Hobby.all, :id, :name) do |b| %>
<%= b.label { b.check_box + b.text } %>
<% end %>
</div>
</div>
</div>
コントローラー
ストロングパラメーターに指定を追加します。
# app/controllers/questionnaries_controller.rb
class QuestionnariesController < ApplicationController
・・・省略
def post_params
params.require(:instance).permit(・・・省略, {:hobby_ids => []})
end
end