2017-09-02 11 views
2

データベースをシードしようとしましたが、検証に失敗しました。 user_idを見つけることができません:データベースのシード中にhas_manyとcreateでRailsの検証に失敗しました

Validation failed: Characters user can't be blank 

どうしてですか? self.characters.createを実行すると、作成中のキャラクターに自動的に渡されたユーザーIDは表示されませんか?

user.rb

has_many :characters 
accepts_nested_attributes_for :characters 

after_save do 
    if (self.characters.count == 0) 
    self.characters.create 
    end 
end 

character.rb

belongs_to :user 
validates :user_id, presence: true 

seeds.rb

User.create!(email: "[email protected]", 
      activated_at: Time.zone.now, 
      characters_attributes: [{ first_name: "Baz", last_name: "Chump" }]) 

答えて

1

あなたが取得している理由このエラーは、関連付けられた親のUserオブジェクトがない限り、Characterオブジェクトをデータベースに保存できません。あなたのdb/seeds.rbファイルで

、あなたはCharacterオブジェクトを作成しようとし、その後、Userオブジェクトが、Characterオブジェクトは、有効なuser_idを必要としています。

ソリューション:あなたが明示的に伝えるためにinverse_ofを使用する必要が

CharacterUserオブジェクトに依存オブジェクトことをレール。

has_many :characters, inverse_of: :user 

そして、あなたのCharacterモデルに:

belongs_to :user, inverse_of: :characters 

Characterモデルでの検証は、次のようにする必要があります:

validates :user, presence: true # It will server the same purpose as does `user_id` 

編集:

問題は中に存在しませんafter_save。問題は次の行に存在する:{ first_name: "Baz", last_name: "Chump" }を、しかしCharacterオブジェクトが関連付けられているUserオブジェクトを持っていなければならないため、そのRailsは作成に失敗します。このコードを

User.create!(email: "[email protected]", 
      activated_at: Time.zone.now, 
      characters_attributes: [{ first_name: "Baz", last_name: "Chump" }]) 

、Railsは最初の属性を持つCharacterオブジェクトを作成します。 Characterオブジェクトであり、それはCharacters user can't be blankと記載されています。

inverse_ofを配置すると、Userオブジェクトが最初に作成され、次にidオブジェクトが作成され、その後のCharacterオブジェクトが作成されます。

+0

あなたが提案した変更を加えましたが、私はまだ同じエラーが発生しています。最初に 'Character'オブジェクトを作成しようとしているのはなぜですか?私は 'Character'オブジェクトがユーザIDを必要とするため、意図的に' self_characters.create'を 'after_save'に入れました。 – Bazley

+0

@Bazley私は自分の答えを更新しました。両方のモデルで変更を適用します。 –

+0

ありがとうございますが、ユーザーとキャラクターの両方のモデルを更新しても同じエラーが発生しています。 – Bazley

関連する問題