我们遇到了 FactoryGirl 的奇怪行为。以下是 commonx_log 的定义:
FactoryGirl.define do
factory :commonx_log, :class => 'Commonx::Log' do
log "My log"
resource_id 1
resource "MyString"
last_updated_by_id 1
end
end
这是log
模型中的验证:
validates_presence_of :log, :resource, :resource_id
以下 rspec 将通过:
it "should be OK" do
c = FactoryGirl.build(:commonx_log, :last_updated_by_id => 2)
c.should be_valid
end
但是,一旦我们尝试为resource
and赋值resource_id
:
c = FactoryGirl.build(:commonx_log, :resource => 'resource')
有一个错误:
1) Commonx::Log should be OK
←[31mFailure/Error:←[0m ←[31mc.should be_valid←[0m
←[31mexpected #<Commonx::Log id: nil, log: "My log", resource_id: nil, resource: "resource", last_updated_by_id: 1, created_at: nil, updated_at: nil> to be valid
, but got errors: Resource can't be blank←[0m
什么可能导致错误?这是resource
工厂女孩的关键工作吗?谢谢您的帮助。
更新:
我们的解决方案是resource
在resource_name
日志模型中重命名。之后,我们可以将resource_name
其视为常规字段并进行验证。当resource_id
和resource
出现在对数模型中时,rails 假定它resource
处于某种类型 association
(参见下面 Ryan Bigg 的帖子)。rails 的这种假设会自动放入resource_id
并resource
进行验证,并且不允许将值分配给resource_id
(resource_id
默认情况下应该来自关联)。这种假设会导致我们的应用程序出现问题(无法分配resource_id
),我们重命名resource
以打破这种关联关系。