0

的視圖的嵌套模型實例(的has_many關係)我有UND的模型的模型B和關係是A的has_many B(和B belongs_to的A)。我有一個模型,一個控制器和A的視圖,只有一個B的模型。 我想在A(url/a/1/edit)的編輯視圖中創建和編輯B的實例。創建它的父模型

我知道我可以創建B中的控制器,並呼籲使用A的視圖形式的方法,但我需要回到重定向到A的看法,因爲我不想爲B.實際的意見

有沒有推薦的方式做到這一點?我想要的是不要打破rails提供的任何助手(例如,在轉發之後,我認爲獲取錯誤消息和類似的東西是一種痛苦)。

在此先感謝!

+0

嘗試'創業板「破繭」'嵌套表格,您可以在這裏得到文檔https://開頭的github .com/nathanvda/cocoon – Mayank

+0

如果你不需要從視圖輸入,你可以簡單地在模型A上使用回調方法(before_save/after_save)。所以當你的編輯方法保存更新的模型A時,回調將被觸發,你然後可以在該回調中編輯關聯的模型。如果您需要從視圖編輯嵌套模型的字段,那麼最好使用@Mayank提到的gem「cocoon」。 –

回答

0

在你使用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具有屬性的陣列創建嵌套bsvalidates_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? } 
+0

這通常是Rails理解的最複雜的部分之一,我要求您在詢問後續問題之前,通讀本文答案中的文檔鏈接。 – max

+0

不,你不需要繭寶石。它確實使處理嵌套記錄的某些方面更容易,但也抽象出了許多重要的知識。 – max

+0

非常感謝您的詳細解答。如果我有跟進問題,我會研究它並回來。 (一旦完成,請將答案標記爲正確。* g *) – LetzFlow