2012-02-01 57 views
0

我是新來的紅寶石和鐵軌,所以要溫柔。不能向後關聯

我現在有3種型號(遊戲,比賽,球員,用戶)

game.rb

has_many :matches 

match.rb

belongs_to :game 
has_many :players 

player.rb

belongs_to :match 
belongs_to :user 

現在我想填補e玩家模型中的關聯。

我基本上做到:

players_controller.rb

def create 
@game = Game.find(params[:game_id]) 
@match = @game.matches.find(params[:match_id]) 
@player = @match.players.create(params[:player]) 
@player.user = User.find(current_user.id) 
end 

後,我想在一個視圖中調用

<%= @player.user.email %> 

那麼這個錯誤提出:

undefined method `email' for nil:NilClass 

所以我的問題我做錯了在協會中倒退?它應該有可能以某種方式

+0

你沒有向我們展示你的user.rb中的關聯,但我猜他們看起來像這樣:'has_many:players' – Chazu 2012-02-01 14:58:28

+0

它的用戶1:n播放器關係。 user.rb'has_many:players' – cschaeffler 2012-02-01 15:01:16

回答

1

您需要在@player.user分配後調用@player.save。您的關聯不是「倒退」,您只需在更新其任何屬性後將其保存起來以將更改提交到數據庫即可。

目前,您的創建方法是通過@match.players.create(...)創建新玩家。這是您的player對象最後一次寫入數據庫。將用戶分配給user關聯的下一行永遠不會保存。

還有一個關於樣式的註釋:如果current_player是一個玩家對象,那麼您應該直接將它分配給@player.user而不是查找您已有的對象。最後一行:

@player.user = User.find(current_user.id) 

應該寫成:

@player.user = current_user 
+0

在'@player.user = User.find(current_user.id)'之後加了'@ player.save',但仍然是相同的錯誤。 – cschaeffler 2012-02-01 15:05:07

+0

嘗試'@ player.save!',看看是否有錯誤發生。一個或多個驗證可能會阻止玩家被創建。 – meagar 2012-02-01 15:21:06

+0

修改'@player.user = User.find(current_user.id)'爲'@player.user = current_user/.id'。嘗試了兩種方法,即使使用「@ player.save!」。同樣的錯誤仍然發生 – cschaeffler 2012-02-01 15:30:30

0

要指定用戶屬性後失蹤@player.save