破案
我有以下课程
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
应该发生
为什么工厂女孩在第一种情况下不尊重回调链? 为什么工厂女孩在第二种情况下尊重回调链? 有什么区别?