はじめに
中間テーブルの保存でハマった人へメモを残します。
環境
- Ruby 2.5.9
- Rails 5.2.6
構成
- Furnituresテーブル { name }
- Furniture_scenes中間テーブル { furniture_id, scene_id }
- Scenesテーブル { name }
##手順
- Model(アソシエーションの設定)
- View(formの追加)
- Controller(createアクション)
- 完了
Model(アソシエーションの設定)
model/furniture.rb
class Furniture < ApplicationRecord
has_many :furniture_scenes
has_many :scenes, through: :furniture_scenes
end
model/furniture_scene.rb
class FurnitureScene < ApplicationRecord
belongs_to :furniture
belongs_to :scene
end
model/scene.rb
class Scene < ApplicationRecord
has_many :furniture_scenes
has_many :furnitures, through: :furniture_scenes
end
through: :furniture_scenes
で関連するモデルを使用できるようにしています。
View(formの追加)
views/furnitures/new.html.erb
<%= form_for @furniture do |f| %>
<%= f.label :scene_id, class: "control-label" %>
<%= f.collection_check_boxes(:scene_ids, Scene.all, :id, :name) do |b| %>
<label class="checkbox-inline">
<%= b.check_box class:"form-control2" do %>
<%= b.check_box + b.text %>
<% end %>
<%= b.label {b.text} %>
</label>
<% end %>
<%= f.submit %>
<% end %>
collection_check_boxes
の引数で指定しているScene.all
でScenesテーブルから全ての項目を取得しています。
collection_check_boxes
でクラスを指定できなかったので
下記の記事を参考にしました。
【Rails】Ransackのcollection_check_boxesで、checkboxタグに任意のクラスを指定する
:scene_ids
は後述するcontrollerで使用します。
Controller(createアクション)
controller/furnitures_controller.rb
class FurnituresController < ApplicationController
def create
@furniture = Furniture.new(furniture_params)
@furniture.save
end
def furniture_params
params.require(:furniture).permit(:name, scene_ids:[])
end
end
今回のポイントは、
Viewで使用した:scene_ids
を Controllerのストロングパラメーターでscene_ids:[]
とすることでした。
collection_check_boxes
はどうやらXXXX_idsという配列を渡すようです。
完了
おつかれさまでした。