Rails 4.1 MissingAttributeError

时间:2014-05-10 13:58:49

标签: ruby-on-rails activerecord ruby-on-rails-4 associations ruby-on-rails-4.1

我有一个分类的模型

PaypalTransactionResponse(id: integer, paypal_transaction_id: uuid, response: text, created_at: datetime, updated_at: datetime)

class PaypalTransaction < ActiveRecord::Base
    has_many :responses, class_name: "PaypalTransactionResponse", dependent: :destroy
    belongs_to :response, class_name: "PaypalTransactionResponse", foreign_key: "response"
..
end

class PaypalTransactionResponse < ActiveRecord::Base
    has_one :paypal_transaction
    belongs_to :paypal_transaction
..
end

在Rails 4.0.5上,以下代码工作正常。在Rails 4.1.1上它没有

p = PaypalTransaction.first
p.responses.create(response: "some response text")

pry(#<PaypalTransaction>)> p.responses.create(response: "some response text")
  SQL (0.4ms)  INSERT INTO "paypal_transaction_responses" ("created_at", "paypal_transaction_id", "response", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", "2014-05-10 13:54:37.512642"], ["paypal_transaction_id", "048267d9-2d47-4f0b-bc67-e206e296179d"], ["response", "some response text"], ["updated_at", "2014-05-10 13:54:37.512642"]]
ActiveModel::MissingAttributeError: can't write unknown attribute `paypal_transaction_response_id'
from /Users/me/.rvm/gems/ruby-2.1.1/gems/activerecord-4.1.1/lib/active_record/attribute_methods/write.rb:72:in `write_attribute'

此外,我没有paypal_transaction_response_id属性..我猜这里有一些不好的魔法,因为它试图猜测一些不存在的属性。

我没有在Rails 4.1更改日志中发现任何可能暗示此问题的更改。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您的has_one :paypal_transaction关联很可能是问题的原因。

预计PaypalTransaction类上有一个指向PaypalTransactionResponse的外键属性,并且猜测此属性名为paypal_transaction_response_id

如果您将has_one定义为:

has_one :paypal_transaction, foreign_key: "response"

然后,希望能够解决问题。

它现在在rails 4.1中失败的原因是不再支持写任意属性(你不能my_obj[:my_att] = 42)。我怀疑代码在4.0.5中没有错误,但可能并没有像你期望的那样完全正常工作 - 或者至少你正在逃避它无法正常工作。