Bry*_*yce 5 validation ruby-on-rails nested-attributes ruby-on-rails-3
我有两个具有以下结构的模型:
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
Run Code Online (Sandbox Code Playgroud)
我正在用RSpec测试我的应用程序的功能,我注意到一些奇怪的东西.如果我创建属性的哈希值不符合我的嵌套模型的验证标准(如具有无CARD_NUMBER),然后尝试做一个update_attributes电话,然后我得到一个无效的信用卡式返回的钱包对象嵌套模型,以及适当的错误.这是正确的预期行为.
如果我采取相同的哈希虽然并运行assign_attributes,然后save(这是所有update_attributes方法应该做的事,然后我得到返回无效钱包对象与完全无嵌套的对象.这是为什么?我怎样才能更新所有嵌套的属性值并检查错误而不保存?
小智 4
首先 - 你不需要,include ActiveModel::Validations因为它们带有ActiveRecord::Base.
第二 - 是的在内部update_attributes使用assign_attributes,所以基本上它应该按预期工作。
如果您没有任何attr_accessible, attr_protected,with/without_protection选项,并且我假设您正在使用以下命令创建正确的散列
{'credit_card_attributes' => {'card_number' => ''}}
Run Code Online (Sandbox Code Playgroud)
那么它看起来像是 Rails 中的某种错误。但同时我刚刚检查了一下,看起来效果还不错。
如果您只想检查验证而不在测试中保存对象,那么只需运行
Wallet.new(hash_with_attributes).valid?
Run Code Online (Sandbox Code Playgroud)
它应该返回正确的钱包对象,其中包含嵌套的credit_card 和错误。