2015-01-01 193 views
3

从FactoryGirl 2.5.2升级到4.5.0后,对belongs_to关联的验证失败。FactoryGirl belongs_to关联和validates_presence_of失败 - 外键关联,对象不是

两个模型文件:

class User < ActiveRecord::Base  
    ... 
    has_many :things 
    ... 
end 

class Thing < ActiveRecord::Base 
    ... 
    belongs_to :user 
    validates_presence_of :user 
    ... 
end 

工厂:

FactoryGirl.define 
    factory :thing do 
    association :user  
    ... 
    end 
end 

创建新thing总是失败说User must be provided。当我进入代码时,问题是外键正确设置,但关联的对象似乎是零。

>> user = create(:user) 
    (returns saved "user" object) 
>> user.id 
1 
>> thing = build(:thing, user: user) 
    (returns new "thing" object) 
>> thing.valid? 
false 
>> thing.user_id 
1 
>> User.find(1).present? 
true 
>> thing.user 
nil 

我试过各种各样的组合和变化。我试过使用after(:build)块来设置用户并使用不同的FactoryGirl语法。我试过的只是简单的user而不是关联。但它总是归结为这个问题 - 有一个关联的键,它是正确的,但不是关联的对象(即使该对象存在并被保存)。

环境:

ruby 2.1.5 

factory_girl 4.5.0 
factory_girl_rails 4.5.0 
rails 4.2.0 
rspec 3.1.0 
+0

我看到同样的事情。它看起来像我之后(:构建)块甚至没有被解雇 - 就像它在到达这些回调之前验证失败一样。你有什么进展? – funwhilelost

+0

我注意到了一个问题:“用户必须提供”实际上是从工厂还没有完成的另一个模型中发射。假设你简化了你的例子,你可能想检查是否有任何关联的模型也需要一个用户... – funwhilelost

+1

我认为'factory_girl'这部分是一个红色的鲱鱼 - 但至少它更容易集中精确到发生了什么事。根本问题似乎与Rails 4.2本身有关。 –

回答

0

您需要定义一个用户工厂。如果你这样做了,请编辑你的答案以显示它。

+0

暗示为: '>> user = create(:user) (returns saved“user”object) –