0

次のように、has_many ポリモーフィックな Address オブジェクトを持つ Customer モデルがあります。

顧客モデル:

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 番目のアドレス モデルが保存されなくなることもありません。データベース。

私は何が欠けていますか?

4

1 に答える 1

1

あ、やっとわかった!失敗した検証が実際にエラーをスローするようにするには、最後の仕様を変更createする必要がありました。create!

于 2012-11-05T06:54:25.783 に答える