0

의 뷰에 중첩 된 모델 인스턴스 (has_many 관계를) 만들기 나는 싶게 모델 A를 모델 B가와의 관계는 (A belongs_to와 나) has_many의 B입니다. 모델, 컨트롤러 및 A에 대한 뷰 및 B에 대한 모델이 있습니다. A (url/a/1/edit)의 편집 뷰에서 B의 인스턴스를 만들고 편집하려고합니다.은 상위 모델

B에 대한 컨트롤러를 만들고 해당 뷰를 A의 뷰에서 호출 할 수 있지만 B의 실제 뷰를 원하지 않기 때문에 A의 뷰로 다시 리디렉션해야한다는 것을 알고 있습니다.

이 할 수있는 권장 방법이 있나요? 내가 원했던 것은 헬러가 제공하는 레일을 깨뜨리지 않는 것입니다 (예를 들어 앞으로 전달한 후에 오류 메시지와 같은 것을 얻는 것이 고통이라고 생각합니다).

미리 감사드립니다. 당신이 accepts_nested_attributes_for을 사용 모델 수준에

+0

시도는 현재 문서를 얻을 수 있습니다 중첩 된 형태의'보석 "누에 고치"': // GitHub의 당신은이 accepts_nested_attributes_for로 변경하여 작성되지 않은 경우 저장하기 전에 빈 하나를 필터링 할 수 있는지 확인해야합니다 .COM/nathanvda/누에 고치 – Mayank

+0

경우에는 콜백이 트리거 될 것이다, 당신의 편집 방법은 업데이트 된 모델 A를 저장 그래서 때 단순히 모델 A.에 콜백 메소드를 (before_save/after_save)를 사용할 수 있습니다,보기에서 입력을 필요로하고 있지 않습니다 그 콜백에서 연관된 모델을 편집 할 수 있습니다. 보기에서 중첩 된 모델의 필드를 편집해야하는 경우 @Mayank에서 언급 한 보석 "누에 고치"를 더 잘 사용하십시오. –

답변

0

.

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 attributesnested 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? } 
+0

이것은 일반적으로 레일스가 이해해야 할 가장 복잡한 부분 중 하나이며, 후속 질문을하기 전에이 답변의 문서 링크를 자세히 읽어 보시기 바랍니다. – max

+0

그리고 당신은 누에 고치 보석이 필요 없습니다. 중첩 된 레코드를 다루는 특정 측면을보다 쉽게 ​​만들뿐만 아니라 많은 중요한 지식을 추상화합니다. – max

+0

자세한 답변을 주셔서 감사합니다. 나는 그것들을 들여다 볼 것이고 질문을하면 내가 돌아올 것이다. (그리고 내가 해낸 답을 올바른 것으로 표시하시오. * g *) – LetzFlow