cocoonとは?
親子孫関係のテーブルに複数のデータを同時に保存できるようにできるにするためのビューに拡張性を持たせるためのGemです。
モデルの指定(cocoonとは直接関係ない)
1 2 3 4 |
class 親モデル < ApplicationRecord has_many :子モデル, dependent: :destroy accepts_nested_attributes_for :子モデル, allow_destroy: true end |
accepts_nested_attributes_for
Railsが標準で提供しているActiveRecordのメソッドです。cocoonとは直接関係ないですが一緒に使われるケースが多いです。指定することで、親モデルのコントローラーのparamsに「{子モデル}_attributes」という形でパラメータを追加することができます。
具体的には下記のようになります。さらに入れ子にすることも可能です。
1 |
params.require(:親モデル).permit(:親のカラム1,子モデル_attributes: [:id,:子のカラム2,:_destroy]) |
一つのビューで複数のモデルを使う方法
fields_for
これも、cocoonとは関係ないですが親モデルに関連する子モデルを使いたい場合はfields_forを使うと便利です。
1 2 3 4 |
<%= form_with(model: @親モデル, local: true) do |s| %> <%= s.fields_for :子モデル do |t| %> <% end %> <% end %> |
cocoonで用意されているメソッド
link_to_add_association
子要素を一つ追加するためのリンクをviewに追加できます。
1 |
<%= link_to_add_association "ラベル", 親フォーム, :子モデル,data:{association_insertion_node:'追加対象のclass',association_insertion_method:'メソッド'} %> |
なお、「association_insertion_node」や「association_insertion_method」を使うことでどこに子要素を追加するかを細かく指定することができるようです。
link_to_remove_association
モデルを削除するためのリンクをviewに追加できます。
1 |
<%= link_to_remove_association "ラベル", 削除対象のモデル %> |
なお、上記メソッドをRails6以降で動作させようとした場合は下記の手順を実行する必要があるので注意。
https://qiita.com/ashketcham/items/87e3db665ca9c66ce673
この記事へのコメントはありません。