2012-11-05 74 views
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地址模型保存到数据库。

我错过了什么?

回答

1

啊,我终于明白了!我需要在我上一个规范中更改createcreate!,以便使失败的验证实际发生错误。