0

我们的 rails 应用程序中有 user 和 user_level 。用户 has_many user_levels。我们构建 FactoryGirl 数据集如下:

  factory :user_level do 
    position             "admin"
    user
  end

  factory :user do 
    login                 'testuser'
    password              "password1"

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

问题是如何将user_level中的位置重新设置为sales?以下没有工作:

  ul = FactoryGirl.attributes_for(:user_level, :position => 'admin')
  user = FactoryGirl.create(:user, :login => 'test', :password => 'password', 
                            :user_levels => ul)

错误是“未定义的方法'每个'”。替换attributes_forbuild会产生相同的错误。为工厂重置 user_level 位置的正确方法是什么?谢谢。

4

2 回答 2

1

有几种方法可以在用户级别重置子参数。

  1. 添加带有重置参数的第二个用户级别(或更多),同时保留在 after(:build) 回调中定义的默认用户级别。

FactoryGirl 如下:

  factory :user_level do 
    position             "admin"
    user_id               1
  end

  factory :user do 
    login                 'testuser'
    password              "password1"

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

ul = FactoryGirl.build(:user_level, :position => 'sales')
user = FactoryGirl.create(:user, :user_levels => [ul])

上面创建的用户将有两个职位,一个是默认的'admin',第二个是'sales'的职位,这是一个重置职位值的职位。

  1. user_level 需要输入到用户创建中。所有 user_level 参数都可用于重置。

FactoryGirl 如下(用户没有回调):

  factory :user_level do 
    position             "admin"
    user_id               1
  end

  factory :user do 
    login                 'testuser'
    password              "password1"
  end

ul = FactoryGirl.build(:user_level, :position => 'sales')
user = FactoryGirl.create(:user, :user_levels => [ul])

上面创建的用户将只有一个职位“销售”。您可以根据需要在用户创建中自由添加更多用户级别。

于 2012-07-18T17:16:45.710 回答
1

您的错误与 FactoryGirl 无关,而是与纯导轨有关。您正在将单个模型实例添加到 :has_many 关系中,该关系应由数组提供,因此请尝试:

ul = FactoryGirl.attributes_for(:user_level, :position => 'admin')
user = FactoryGirl.create(:user, :login => 'test', :password => 'password', 
                        :user_levels => [ul])
于 2012-07-01T13:50:45.457 回答