2016-04-07 13 views
-1

home_team_user_idとaway_team_user_idのそれぞれに、外部キーを使用してuser_idが割り当てられているゲームのリストがあります。外部キーを持つユーザーIDの代わりにユーザー名を表示

ゲームは両方のユーザーIDだけを格納しますが、現在はガーネットリストにあります。user_idの代わりにユーザー名を表示します。

ビューで直接間違っsollution:

<%= User.find(game.home_team_user_id).email %> 

これは動作しますが、ユーザーが見つからない場合はエラーがスローされます。

このロジックをコントローラに移したいが、私は管理していないようだ。

ゲームCONTROLLER:

class GamesController < ApplicationController 
    before_action :authenticate_user! 

    def index 
     @games = Game.all 
     @home_team_username = User.select(:id, :username).find(game.home_user) 
     @away_team_username = User.select(:id, :username).find(game.away_user) 
    end 

MODELS:

class User < ActiveRecord::Base 

    #RELATIONS SINGLE GAMES 

    has_many :home_games, class_name: 'Game', foreign_key: 'home_team_user_id' 
    has_many :away_games, class_name: 'Game', foreign_key: 'away_team_user_id' 
    end 


class Game < ActiveRecord::Base 

     belongs_to :home_user, class_name: "User", foreign_key: "home_team_user_id" 
     belongs_to :away_user, class_name: "User", foreign_key: "away_team_user_id" 


end 

VIEW:

<% @games.each do |game|%> 
       <tbody> 
        <td><%= game.created_at.strftime("%d-%m-%Y - %Hh%M")%></td> 

      <% if game.home_score == game.away_score %> 
        <td style="background-color: #e67300"><%= @home_team_username.username %></td> 
         <td style="background-color: #e67300"><%= game.home_score %></td> 

        <% elsif game.home_score > game.away_score %> 
        <td style="background-color: #66ff33"><%= @home_team_username.username %></td> 
         <td style="background-color: #66ff33"><%= game.home_score %></td> 

     <% elsif game.home_score < game.away_score %> 

        <td style="background-color: #ff1a1a"><%= @home_team_username.username %></td> 
         <td style="background-color: #ff1a1a"><%= game.home_score %></td> 

     <% end %> 
        <td style="text-align: center">-</td> 

      <% if game.home_score == game.away_score %> 
         <td style="background-color: #e67300"><%= game.away_score %></td> 
         <td style="background-color: #e67300"><%= @away_team_username.username %></td> 

     <% elsif game.home_score < game.away_score %> 
         <td style="background-color: #66ff33"><%= game.away_score %></td> 
         <td style="background-color: #66ff33"><%= @away_team_username.username %></td> 

     <% elsif game.home_score > game.away_score %> 

         <td style="background-color: #ff1a1a"><%= game.away_score %></td> 
        <td style="background-color: #ff1a1a"><%= @away_team_username.username %></td> 

     <% end %> 

私は、これは動作するはずだと思うが、それはエラーを示しています

undefined local variable or method `game' for

何らかの理由で、ビュー内のループからゲーム変数を使用できません。

これを達成する正しい方法は何ですか?

答えて

2

コントローラーのインデックスアクションにgameを使用しようとしているためにエラーが発生していますが、ここでは1つのゲームには定義されていません。私の意見でそれを行うための正しい方法は、単にコントローラ内のすべてのゲーム設定されている:

def index 
    @games = Game.all 
end 

をそしてちょうど例えば、このようなビューに名前を取得する:

<td style="background-color: #e67300"><%= game.homeuser.username %></td> 

は削除された「表示するにはユーザーのあなたは、このように、ループの先頭で変数を割り当てることができます:

home_user_name = if game.homeuser.present? 
        game.homeuser.username 
       else 
        'Deleted user' 
       end 

または1行で:

home_user_name = game.homeuser.try(:username).presence || 'Deleted user' 

そして、これを使用する:

<td style="background-color: #e67300"><%= home_user_name %></td> 
+0

これは機能します!しかし、彼のIDがまだゲームリストに残っている間にユーザーが削除されても、それでもエラーになります。これで削除されたユーザーが表示されるはずです... –

+0

これを処理するための回答が更新されました。 – IngoAlbers

+0

Thxは人を割り当てます!これは素晴らしいです! –

0

インデックスには何を表示しようとしていますか?あなたはすべてのゲームのためにすべてのユーザーを欲しいですか?

@home_team_username = User.select(:id, :username).find(game.home_user) 

この

@home_team_username = game.home_user 

game.home_userと交換することができるユーザーです。そのオブジェクトのユーザ名を返すことができます。

また、変数@home_team_usernameの名前を@home_team_userに変更するか、username(ユーザーではない)を保存して、ビューに渡します。

+0

をそれはまだ同じエラーを示す「#のために未定義のローカル変数やメソッド 'ゲームを」」 は、私は、ビューところでループとの間の接続を考えます変数ゲームが設定されているコントローラと接続していません... –

+0

ええ、変数が存在しません。上記の私の編集を参照してください – born4new

+0

すべての試合を見せたい 各ゲームはhome_team_idとaway_team_idを持っていますが、ビューではこのリストに対応するユーザーを表示する必要があります。 –

0

まあ、宣言されていないゲーム変数を使用しているようです(メソッドGamesController#index、2行目)。

関連する問題