2017-09-02 52 views
2

我試圖爲我的數據庫播種,但我得到一個失敗的驗證。它找不到user_idRails has_many驗證失敗並在數據庫種子期間創建

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對象。

在你的數據庫/文件seeds.rb,你要創建Character對象,然後User對象,但Character對象需要一個有效的user_id

解決方案:

您需要使用inverse_of明確地告訴Rails是Character對象取決於User對象。

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。在下面的行存在的問題:

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

通過這個代碼,Rails會首先創建與屬性的Character對象:{ first_name: "Baz", last_name: "Chump" },但是由於Character對象必須有一個相關的User對象,所以Rails會無法創建一個Character對象,說明Characters user can't be blank

inverse_of使Rails先創建一個User對象,然後用它的id創建後續的Character對象。

+0

我已經改變了你的建議,但我仍然得到相同的錯誤。爲什麼它試圖首先創建'Character'對象?我故意將'self.characters.create'放在'after_save'中,因爲'Character'對象需要用戶標識。 – Bazley

+0

@Bazley我已經更新了我的答案。在兩個模型中應用更改。 –

+0

謝謝,但即使在更新用戶和角色模型後,我仍然遇到同樣的錯誤。 – Bazley