在你使用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
也不是有效的。
要創建nested form fields使用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 %>
要whitelist nested attributes使用散列關鍵字與允許的屬性爲孩子記錄數組:
params.require(:a)
.permit(:foo, bs_attributes: [:id, :bar])
當創建新的記錄,你還必須「種子」,如果你想有是創建嵌套記錄當前的輸入形式:
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也只是增加一個,並做到每一次。所以你將永遠有一個「空」的添加。你需要確保節省,如果它沒有被改變accepts_nested_attributes_for
填充之前過濾掉空單:
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」。 –