3

私はbelongs_toアサーションを持つフォームを持っています。ユーザーは自分のアドレスから選択するか、新しいものを作成できるようにしたいと思います。フォームはすなわち、Rails simple_formアソシエーションselect with createオプション

"transaction" => { "address_id" = "25", 
    "address_attributes" => { "id" => "25" } } 

私が簡略化されてきた関連ファイルためのパラメータで矛盾する情報の検証エラーがある場合、それは壊れる:

Transaction.rbを

class Transaction < ActiveRecord::Base 
    belongs_to :address 
    accepts_nested_attributes_for :address 
end 

Address.rb

class Address < ActiveRecord::Base 
    has_many :transactions 
end 

トランザクション#new view

<%= simple_form_for @transaction do |f| %> 

    <%= f.association :address, :collection => current_user.addresses, 
    :include_blank => "Enter new address", 
    :value_method => :id %> 

    <%= f.simple_fields_for :address do |address_fields| %> 
    <%= address_fields.input :line1 %> 
    <%= address_fields.input :line2 %> 
    <%= address_fields.input :city %> 
    <%= address_fields.input :state %> 
    <%= address_fields.input :zip, :label => "Zip/Post Code" %> 
    <% end %> 

    <%= f.submit "Confirm" %> 

<% end %> 

トランザクション#はもちろん、コントローラ

def create 
    trans_params = {} 
    if params[:transaction][:address_id].blank? && !params[:transaction][:address_attributes].nil? 
    trans_params[:address_attributes] = params[:transaction][:address_attributes] 
    elsif !params[:transaction][:address_id].nil? 
    trans_params[:address_id] = params[:transaction][:address_id] 
    end 

    @transaction = Transaction.new(trans_params) 
end 

を作成するコード行方不明のチャンクがありますが、私は、これらは唯一の関連するセクションだと思います。私がいる問題は、フォームを送信する際、あると検証エラーがあり、simple_formは自動的にパラメータが衝突させると、エラーを与え、私のフォームの最後に<input id="transaction_address_attributes_id" name="transaction[address_attributes][id]" type="hidden" value="25">を追加します。

Couldn't find Address with ID=25 for Transaction with ID= 

私が想像しますコントローラー内のパラメーターを処理する方がはるかに優れています。何か案は?私はjavascriptを使用して "アドレス属性"フォームを削除して再レンダリングすることを検討しましたが、Javascriptに依存していません。

答えて

0

私はguide to doing nested model forms in railsと書いています。ここでは、作成または選択の問題を解決しています。

問題はコントローラに関連しています。コードがなければ、伝えるのは難しいですが、何が起きているかは、作成時に何かが間違っている(検証エラー)と、アドレスが保存され、IDがTransactionに保存されますが、アドレスの作成はロールバックされますが、IDはあなたの(未保存の)トランザクションに残っていて、あなたが見ているエラーを表示します。

もう一度レンダリングする前に、address_idをnilに設定することができますが、新しいアドレスが作成されたか既存のアドレスが選択されたかによって異なります。

これが役に立ちます。

+0

ありがとうございました。繭はJavaScriptを無効にしてフォールバックしていますか? – tom

+0

私はそれを試しましたが、いくつか問題がありました。ネストされた関連付けのフィールドが検証に失敗すると、ページがリロードされるとフィールドが消えます。 – tom

+0

githubに問題を投稿してください。私はそれをさらに調査することができます。 – nathanvda

関連する問題