2016-05-21 3 views
0

ネストされたモデルに関する概念的な疑念があります。この質問で自分を明確にすることを願っています。Rails:許可しない:ネストされたモデルのIDにより、新しいインスタンスが自動的に生成されます。どうして?

Iは3つのモデル、B、及びCを有します。 は、BおよびCのネストされた属性を受け入れます。 AController#newでは、@ a = A.new、@ a.b.build、@ a.c.buildを書きます(私は以下のコードを共有します)。 A定義

SパラメータとCのパラメータのパラメータは、私がBを許可します "。 問題:CのID:を許可することを忘れてしまった。私は私のウェブサイト上でのインスタンスを編集しますたびしたがって

は、(たとえば、で「// 1 /編集」)、それが自動的にCの新しいインスタンスを作成します。 、それがをなぜ起こるのだろうか:問題の診断

は(ID欠落していた、そしてそれが問題であったと推測され、私はちょうどCさんがいることを発見)は非常に簡単でした。誰かが洞察力を持っていますか?私のコードの詳細が続きます。

a.rb

has_many :b 
has_many :c  
accepts_nested_attributes_for :b 
accepts_nested_attributes_for :c 

a_controlle.rb

def new 
    @a = A.new 
    @a = @a.b.build 
    @a = @a.c.build 
end 

def edit 
    @a = A.find(params[:id]) 
end 

def update 
    if A.find(params[:id]).update_attributes(a_params) 
    #SOME CODE 
end 

def create 
    @a = A.new(a_params) 
    #SOME CODE 
end 

private 

def a_params 
    params.require[:a].permit(:a_name, b_attributes: [:id, :b_name], 
    c_attributes: [:c_name]) ## SEE, I had forgotten C's :id. 
end 

そしてA/new.html.erb及びA/edit.html.erb両方B及びC fields_for有します

だから誰でもいつでも私はA/[:id] /にアクセスし、編集するとCの新しいインスタンスが生成されますそれを許可するのを忘れていた:id?

答えて

1

これは仕様です。 1つがaccepts_nested_attributes_for :cを使用し、Cの属性を送信する場合、Cc_attributes)のパラメータに:idのパラメータがない場合、そのオブジェクトが作成されます。

だから私は、あなたがネストされたCBモデルの属性と、あなたがABCオブジェクトのためのあなたの属性を送信するフォームを提出するたび持つフォームがあるとします。 c_attributes:idの新しいオブジェクトなしで送信するたびに作成されます。

あなたが試して何Cオブジェクトが作成されていないか、編集されていることを確認するためにのみA ojectまたはABオブジェクトのためのフォームを作成することができます。

何が起こっているのか理解してくれることを願っています。

関連する問題