我有两个具有以下结构的模型:
class Wallet < ActiveRecord::Base
include ActiveModel::Validations
has_one :credit_card
accepts_nested_attributes_for :credit_card
validates :credit_card, :presence => true
validates_associated :credit_card
...
end
class CreditCard < ActiveRecord::Base
include ActiveModel::Validations
belongs_to :wallet
validates :card_number, :presence => true
validates :expiration_date, :presence => true
...
end
我正在使用 RSpec 测试我的应用程序的功能,我注意到一些奇怪的东西。如果我创建一个属性不符合嵌套模型验证条件的哈希(例如具有 nil card_number),然后尝试进行update_attributes
调用,那么我在 Wallet 对象中返回的内容包含无效的 CreditCard 嵌套模型和相应的错误。这是正确的、预期的行为。
如果我采用相同的 Hash 并运行assign_attributes
,然后save
(这就是 update_attributes 应该做的所有事情,那么我会返回一个无效的 Wallet 对象,其中包含一个完全为零的嵌套对象。为什么会这样?我怎样才能更新所有嵌套的对象属性值并检查错误而不保存?