.
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
도 유효하지 않습니다.
자식 레코드에 대한 허용 속성의 배열과 해시 키를 사용
whitelist nested attributes에
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 %>
를 만들려면 : 새 레코드를 생성 할 때
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도 하나를 추가 할 수 있습니다 때마다 그렇게. 그래서 당신은 항상 하나의 "비어있는"것을 추가 할 것입니다. HTTPS
accepts_nested_attributes_for :bs, reject_if: proc { |attr| attr['bar'].blank? }
출처
2017-04-15 17:05:25
max
시도는 현재 문서를 얻을 수 있습니다 중첩 된 형태의'보석 "누에 고치"': // GitHub의 당신은이
accepts_nested_attributes_for
로 변경하여 작성되지 않은 경우 저장하기 전에 빈 하나를 필터링 할 수 있는지 확인해야합니다 .COM/nathanvda/누에 고치 – Mayank경우에는 콜백이 트리거 될 것이다, 당신의 편집 방법은 업데이트 된 모델 A를 저장 그래서 때 단순히 모델 A.에 콜백 메소드를 (before_save/after_save)를 사용할 수 있습니다,보기에서 입력을 필요로하고 있지 않습니다 그 콜백에서 연관된 모델을 편집 할 수 있습니다. 보기에서 중첩 된 모델의 필드를 편집해야하는 경우 @Mayank에서 언급 한 보석 "누에 고치"를 더 잘 사용하십시오. –