モデルレベルではaccepts_nested_attributes_for
を使用します。
class A < ApplicationModel
has_many :bs
accepts_nested_attributes_for :bs
validates_associated :bs
end
class B < ApplicationModel
belongs_to :a
end
これはテイク属性をすることができますし、属性の配列を持つ属性bs_attributes
を渡すことで、ネストされたbs
を作成します。 validates_associated
は、Aが永続化できないことを保証するために使用することもでき、bs
も有効ではありません。
params.require(:a)
.permit(:foo, bs_attributes: [:id, :bar])
新しいレコードを作成するときにも、「しなければなりません:子レコードの許可属性の配列とハッシュキーを使用しwhitelist nested attributesにfields_for
<%= form_for(@a) do |f| %>
# field on A
<%= f.text_input :foo %>
# creates a fields for each B associated with A.
<%= f.fields_for(:bs) do |b| %>
<%= b.text_input :bar %>
<% end %>
<% end %>
nested form fields使用を作成するには
ネストされたレコードを作成するための入力が存在するようにするには、このフォームを「シード」します。
class AsController < ApplicationController
def new
@a = A.new
seed_form
end
def create
@a = A.new(a_params)
if @a.save
redirect_to @a
else
seed_form
render :new
end
end
def update
if @a.update(a_params)
redirect_to @a
else
render :edit
end
end
private
def seed_form
5.times { @a.bs.new } if @a.bs.none?
end
def a_params
params.require(:a)
.permit(:foo, bs_attributes: [:id, :bar])
end
end
編集: seed_formは、1つ追加して毎回行うこともできます。だからあなたはいつも "空の"ものを1つ追加します。あなたはそれがaccepts_nested_attributes_for
を変更することで満たされていなかった場合は、保存する前に、空の1をフィルタリングすることを確認する必要があります。
accepts_nested_attributes_for :bs, reject_if: proc { |attr| attr['bar'].blank? }
出典
2017-04-15 17:05:25
max
ネストされたフォームのためにあなたがここにドキュメントを取得することができます ''宝石「繭」しようとします。https:// githubの.com/nathanvda/cocoon – Mayank
モデルAでコールバックメソッド(before_save/after_save)を使用するだけで、ビューからの入力が不要な場合は、更新されたモデルAを編集メソッドで保存するとコールバックがトリガーされ、そのコールバックで関連するモデルを編集することができます。ネストされたモデルのフィールドをビューから編集する必要がある場合は、@Mayankが参照するgem "cocoon"を使用してください。 –