0

这个问题可能已经被问过很多次了。这是我们的版本。我们的 rails 3.1 应用程序中有 user 和 user_level 模型。一个用户有_many user_levels。

class User < ActiveRecord::Base
  has_many :user_levels
  accepts_nested_attributes_for :user_levels, :allow_destroy => true
  validates_presence_of :user_levels
end

class UserLevel < ActiveRecord::Base
  belongs_to :user 
  validates :position, :presence => true
end

这是我们在 FactoryGirl 3.3 中所拥有的:

FactoryGirl.define do

  factory :user_level do 
    position             "admin"
    user
  end

  factory :user do     
    name                  "Test User"
    login                 'testuser'
    password              "password1"

    factory :user_with_levels do
      #user_levels
      after(:create) do |user|
        FactoryGirl(:user_level, :user => user)
      end
    end
  end
end

u = FactoryGirl.build(:user_with_levels) or u = FactoryGirl.create(:user_with_levels)在我们的 rspec 中使用。创建后回调不起作用,并且有错误说Validation failed: User levels can't be blank。上面的回调有什么问题?非常感谢。

4

2 回答 2

4

这是一个有效的解决方案。它基于 Tim Riley 的以下帖子:http: //icelab.com.au/articles/factorygirl-and-has-many-associations/

FactoryGirl.define do

  factory :user_level do 
    position             "admin"
    user
  end

  factory :user do     
    name                  "Test User"
    login                 'testuser'
    password              "password1"

    #user_levels
    after(:build) do |user|
      user.user_levels << FactoryGirl.build(:user_level, :user => user)
    end
  end
end

问题(用户级别不能为空)是因为保存用户时没有用户级别。用户级别需要与用户一起构建。

于 2012-06-29T17:16:29.323 回答
1

我认为这是因为每当create尝试到save工厂user时,对嵌套模型的验证都会触发。您是否尝试过使用after(:build)回调?

于 2012-06-29T16:13:33.693 回答