1

我们遇到了 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

但是,一旦我们尝试为resourceand赋值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工厂女孩的关键工作吗?谢谢您的帮助。

更新:

我们的解决方案是resourceresource_name日志模型中重命名。之后,我们可以将resource_name其视为常规字段并进行验证。当resource_idresource出现在对数模型中时,rails 假定它resource处于某种类型 association(参见下面 Ryan Bigg 的帖子)。rails 的这种假设会自动放入resource_idresource进行验证,并且不允许将值分配给resource_idresource_id默认情况下应该来自关联)。这种假设会导致我们的应用程序出现问题(无法分配resource_id),我们重命名resource以打破这种关联关系。

4

2 回答 2

1

这里的问题是因为您正在验证关联的存在。你根本不需要这样做。resource从您的validates_presence_of线路中删除。

在您的应用程序中是否存在可以在没有资源的情况下创建日志条目的实际案例?如果不是,我不会太在意这些属性的验证。如果您非常担心resource_id为空,那么放置数据库约束resource_id将是合适的方法。

于 2013-08-11T21:38:18.147 回答
0

resource是用于路由的 rails 关键字,也许这就是给您带来麻烦的原因?

于 2013-08-11T21:25:08.803 回答