2011-02-22 11 views
2

Rails 3.0.3 Appでこの問題に直面していますが、これはばかげたエラーだと思いますが、なぜそれが起こっているのか、 ActiveRecordの動作を誤解していて、実際にはエラーではありません。"Could not find"エラーActiveRecord.newメソッド

これはシナリオですが、私は三つのモデルました:私はこの方法によって、ハッシュパラメータを渡す新しいユーザーをインスタンス化しようとした場合


class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable 
    has_many :addresses, :as => :addressable 
    accepts_nested_attributes_for :addresses 
end 

class Address < ActiveRecord::Base 
    belongs_to :addressable, :polymorphic => true 
    belongs_to :address_base 
    accepts_nested_attributes_for :address_base 
end 

class AddressBase < ActiveRecord::Base 
    has_many :address 
end 

を:


User.new({"addresses_attributes"=> 
    {"0"=> 
     {"number"=>"10", 
     "complement"=>"Next Starbucks", 
     "address_base_attributes"=> 
      {"city"=>"San Francisco", 
      "zip_code"=>"00010", 
      "district"=>"San Francisco", 
      "id"=>"10", 
      "street"=>"Market St.", 
      "state"=>"CA"} 
     } 
    }, 
    "name"=>"Homer Simpson", 
    "password_confirmation"=>"[FILTERED]", 
    "document"=>"123321111", 
    "password"=>"[FILTERED]", 
    "email"=>"[email protected]" 
}) 

私はエラーに直面

Couldn't find AddressBase with ID=10 for Address with ID=

そして、それAddressBaseがすでに存在し、アドレスがないので、私はAddressBを削除した場合、それは、たまたまハッシュのase.idパラメータはすべて動作しますが、この方法では常にAddressとAddressBaseの新しいレジスタが作成されるため、必要ありません。私の意図は、AddressBaseのコモンズを再利用しているため、既存のAddressBaseを持つ新しいAddressのシナリオが必要になります。

これは私の疑問です。私はAddressBaseハッシュにいくつかのパラメータがありませんか?レコードがすでに存在していると言っているような何か?それとも、ActiveRecordのbelongs_toとhas_manyの関連付けに問題がありますか?

ありがとうございます。

答えて

1

問題は、railsモデルでID属性を一括して割り当てることができないということです(モデルを初期化するデータハッシュにIDを渡すことはできません)。

あなたが状況を再現するのは難しいですが、モデルが存在することがわかっていると、すべてのデータを含むハッシュの代わりにaddress_baseのIDを提供する方が簡単です。例えば

:ダニー・hiemstra @

User.new({"addresses_attributes"=> 
    {"0"=> 
     {"number"=>"10", 
     "complement"=>"Next Starbucks", 
     "address_base_id" => 10} 
    }, 
    "name"=>"Homer Simpson", 
    "password_confirmation"=>"[FILTERED]", 
    "document"=>"123321111", 
    "password"=>"[FILTERED]", 
    "email"=>"[email protected]" 

})

+0

ありがとう!それは私が本当に見ることができなかったことです。問題がシナリオを持っているので、AddressBaseがすでに存在するので、私はハッシュでaddress_base_idを渡します.2番目のシナリオは、AddressBaseが彼が作成される必要があり、私は彼がハッシュのすべての値を渡す必要があります、私はこれを行う方法を把握しようとします。どうもありがとうございました。 – avaz

+0

また、まずHash.deleteメソッドなどでparamsハッシュからキーを削除してから、address_base_idを持つ新しい値をハッシュに追加するかどうかを確認します。 –

+0

私は私のコントローラでチェックをしています。私はハッシュの "id"をもう何も渡していません。コントローラーで、データベース内の指定されたzip_codeにAddressBaseが既に存在するかどうかを確認します。直接 'user.addresses.first.address_base = address_base_from_database'を参照してください(これは単なるスニペットです)。falseの場合は、ユーザーを保存するだけで、アドレスとaddress_baseが作成されます。しかし、私が望むのは、この問題を直接的に解決することです。なぜ、ハッシュがAddressのレジスタを探すためにAddressBaseの 'id'を持っているのですか?これはbelongs_toの共通の動作ですか? – avaz

関連する問題