2012-02-01 8 views
0

私はルビーとレールを初めて使いました。後方への関連付けができません

私は現在3機種(ゲーム、マッチ、プレイヤー、ユーザー)

game.rbを持って

has_many :matches 

match.rb

belongs_to :game 
has_many :players 

player.rb

belongs_to :match 
belongs_to :user 

今、私はthosを埋めたいプレイヤーモデルの関連付けを行う。

私は基本的に何をすべきか:

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

+0

のユーザー1:nのプレイヤー関係のように見えます。 user.rb 'has_many:players' – cschaeffler

答えて

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

+0

'@ player.save!'を試して、エラーが発生していないか確認してください。 1つまたは複数のバリデーションがプレイヤーの作成を妨げている可能性があります。 – meagar

+0

は、 '@player.user = User.find(current_user.id)'を '@player.user = current_user/.id'に変更しました。 @ player.save!でも両方を試しました。それでも同じエラーが発生する – cschaeffler

0

あなたはユーザー属性を割り当てた後@player.saveが欠落しています。

関連する問題