FactoryGirl不尊重回调订单

时间:2014-03-10 20:11:32

标签: ruby-on-rails-3 callback factory-bot rails-activerecord

破案

我有以下课程

 class Vehicle < ActiveRecord::Base
     belongs_to :manufacturer
     belongs_to :production_plant
     before_save :delegate_audit_number

     attr_accessible :manufacturer_id, :production_plant_id, :audit_number
     private

        def delegate_audit_number
          self.audit_number ||= self.manufacturer.audits.last.try(:number)
        end
 end

以及以下工厂

  FactoryGirl.define do
    factory :vehicle do
      association :production_plant, factory: :production_plant
      after(:validation) do |v|
        v.manufacturer_id = v.production_plant.manufacturer_id
      end
    end
  end

然后使用

FactoryGirl.create(:vehicle)中调用before_save失败
          Failure/Error: @vehicle = FactoryGirl.create(:vehicle)
             NoMethodError:
               undefined method `audits' for nil:NilClass

通过调试,我发现了两件事:

1)制造商方法在nil回调

中为before_save

2)after_validation回调永远不会被击中。

工作案例

除了将before_save移出到观察者

之外,每种方式都与破案相同
class AuditNumberObserver < ActiveRecord::Observer
  observe :vehicle

  def before_save(entity)
    entity.audit_number ||= entity.manufacturer.audits.last.try(:number)
  end
end

现在是我的理解(基于文档中的以下列表: http://guides.rubyonrails.org/v3.2.9/active_record_validations_callbacks.html#available-callbacks

after_validation

之前before_save应该发生

为什么工厂女孩在第一种情况下不尊重回调链? 为什么工厂女孩在第二种情况下尊重回调链? 有什么区别?

1 个答案:

答案 0 :(得分:1)

我认为您的问题是在工厂中使用after(:validation)

根据FactoryGirl's README,这个回调不是由gem定义的。