0
我有一个客户模型HAS_MANY多态地址的对象,像这样:Rails的嵌套模型创建不尊重验证约束
客户型号:
class Customer < ActiveRecord::Base
has_many :mailing_addresses, :as => :addressable, :class_name => 'Address', dependent => :destroy
accepts_nested_attributes_for :mailing_addresses
validates :mailing_addresses, :presence => true
validates_associated :mailing_addresses
end
地址型号:
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
validate :validate_quota
private
def validate_quota
case addressable_type
when "Customer"
customer = Customer.find(addressable_id)
if customer.mailing_addresses.size >= 3
puts "Adding too many records"
errors.add(:addressable, "Too many records")
end
end
end
我我也使用RSpec来测试配额限制是否受到尊重。所以这个规范通过,例如:
it "observes quota limit" do
customer = FactoryGirl.create(:customer, :number_of_mailing_addresses => 3)
expect {
address = FactoryGirl.create(:mailing_address, :addressable => customer)
}.to raise_error
customer.mailing_addresses.count.should eq(3)
end
这是很好的。然而,这种可怕的失败:
it "fails add if already 3 addresses" do
customer = FactoryGirl.create(:customer, :number_of_mailing_addresses => 3)
expect {
customer.mailing_addresses.create(FactoryGirl.attributes_for(:mailing_address).except(:addressable))
}.to raise_error
end
我甚至可以看到,该地址验证失败的规范输出,但由于某些原因,它不会引发错误“customer.mailing_addresses.create()”,也没有验证失败,阻止第4地址模型保存到数据库。
我错过了什么?