0

この質問はおそらく何度も聞かれたことでしょう。これが私たちのバージョンです。Rails 3.1 アプリには user と user_level モデルがあります。ユーザーには多くのユーザーレベルがあります。

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 に答える