1

我对 Ruby/Rails 还很陌生,我遇到了一个奇怪的问题,我似乎无法理解我到底做错了什么。

我认为我有以下代码

<% gameNum = 0 %>
gameNum: <%= gameNum %>
homeTeamIndex: <%= @games[gameNum].homeTeamIndex %>
awayTeamIndex: <%= @games[gameNum].awayTeamIndex %><br />
<%= @NflTeams[@games[gameNum].homeTeamIndex].name %>
<%= @NflTeams[@games[gameNum].awayTeamIndex].name %><br />
<% gameNum = 1 %>
gameNum: <%= gameNum %> 
homeTeamIndex: <%= @games[gameNum].homeTeamIndex %>
awayTeamIndex: <%= @games[gameNum].awayTeamIndex %><br />
<%= @NflTeams[@games[gameNum].homeTeamIndex].name %>
<%= @NflTeams[@games[gameNum].awayTeamIndex].name %><br />

<% (0..@games.count).each do |gameNum| %>
  gameNum: <%= gameNum %>
  homeTeamIndex: <%#= @games[gameNum].homeTeamIndex %>
  awayTeamIndex: <%#= @games[gameNum].awayTeamIndex %> <br />
  <%#= @NflTeams[@games[gameNum].homeTeamIndex].name %>
  <%#= @NflTeams[@games[gameNum].awayTeamIndex].name %>
<% end %>

当我查看我的视图时,我得到以下结果:

gameNum: 0 homeTeamIndex: 10 awayTeamIndex: 3
Detroit Lions Buffalo Bills
gameNum: 1 homeTeamIndex:  awayTeamIndex: 
Cinncinatti Bengals Cleveland Browns
gameNum: 0 homeTeamIndex:  awayTeamIndex: 
homeTeamIndex: awayTeamIndex:
gameNum: 1 homeTeamIndex:  awayTeamIndex: 
homeTeamIndex: awayTeamIndex:
gameNum: 2 homeTeamIndex:  awayTeamIndex: 
homeTeamIndex: awayTeamIndex:
gameNum: 3 homeTeamIndex:  awayTeamIndex: 
homeTeamIndex: awayTeamIndex:
gameNum: 4 homeTeamIndex:  awayTeamIndex: 

但是,如果我取消注释任何一行:

homeTeamIndex: <%#= @games[gameNum].homeTeamIndex %>
awayTeamIndex: <%#= @games[gameNum].awayTeamIndex %> <br />
<%#= @NflTeams[@games[gameNum].homeTeamIndex].name %>
<%#= @NflTeams[@games[gameNum].awayTeamIndex].name %>

我收到以下错误(方法名称根据我取消注释的行更改):

undefined method `homeTeamIndex' for nil:NilClass

我真的不明白循环中发生了什么导致实例变量不可用。

我希望有人能告诉我我到底做错了什么,因为这看起来确实是一件简单的事情,但我无法让它发挥作用。

更新

根据 Dmitry 的建议,我将观点改变如下:

<% gameNum = 0 %>
<% (@games).each do |game| %>
  <strong>Game <%= gameNum+1 %>  </strong> <br />
  <%= image_tag(@NflTeams[game.homeTeamIndex].imagePath,
                size: "40") %>
  <%= @NflTeams[game.homeTeamIndex].name %>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VS
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <%= image_tag(@NflTeams[game.awayTeamIndex].imagePath,
                size: "40") %>
  <%= @NflTeams[game.awayTeamIndex].name %> <br />
  <% gameNum += 1 %>
<% end %>

型号如下:

橄榄球队

class CreateNflTeams < ActiveRecord::Migration
  def change
    create_table :nfl_teams do |t|
      t.string :name
      t.string :imagePath

      t.timestamps
    end
  end
end

游戏

class CreateGames < ActiveRecord::Migration
  def change
    create_table :games do |t|
      t.integer :homeTeamIndex
      t.integer :awayTeamIndex
      t.integer :spread
      t.integer :week_id

      t.timestamps
    end
  end
end

awayTeamIndex 和 homTeamIndex 是 NflTeams 模型的索引,因此我可以轻松提取 Name 和 ImagePath。

我仍然在线获得未定义的方法:

<%= image_tag(@NflTeams[game.homeTeamIndex].imagePath,
              size: "40") %>

还有其他建议吗?

更新 2

我只包括迁移,因为这两个模型的模型并不多。但在这里。

class NflTeam < ActiveRecord::Base
end

class Game < ActiveRecord::Base

  belongs_to :week

  validates :homeTeamIndex, :inclusion => { :in => 0..100 }
  validates :awayTeamIndex, :inclusion => { :in => 0..100 }
end

这是控制器代码:

class WeeksController < ApplicationController
  before_action :signed_in_user
  before_action :confirmed_user

  ...

  def show
    @week = Week.find(params[:id])
    @games = @week.games
    @NflTeams = NflTeam.all
  end

  ...

end
4

1 回答 1

0

您没有@games正确地循环访问您。看起来您正在考虑这一行中的 gameNum:

<% (0..@games.count).each do |gameNum| %>  

就好像它是一个数字索引并使用它来访问集合中的对象,在以下行中:

homeTeamIndex: <%#= @games[gameNum].homeTeamIndex %>

这是错误的,因为“gameNum”实际上是您从魔法红宝石为您获取的@games 集合中的对象,所以您需要的是这样的:

<% (@games).each do |game| %>
  gameNum: <%= game.number %>
  homeTeamIndex: <%= game.homeTeamIndex %>
  awayTeamIndex: <%= game.awayTeamIndex %> <br />
  <%= game.homeTeam.name %>
  <%= game.awayTeam.name %>
<% end %>

希望这可以帮助 :)

PS
这个解决方案当然取决于你的模型是如何设置的,如果你能展示它们,它可能会让你的问题更清楚,以便其他人解释。


编辑 - 完整的解决方案

我将向您展示在您的解决方案中呈现信息和平的方式。

要开始一个小建议,您在评论中提到

将其更改为仅以 homeTeamIndex 和 awayTeamIndex 的形式查询数据库

虽然这可能有效,但将此类例程放在视图中是一种不好的做法,但最好在帮助程序中定义一个方法来完成此类例程并在视图中调用它。

现在,解决方案...

首先,您需要正确定义模型关联,从您共享的代码来看,这些关联只是部分定义的。你需要的是:

像这样告诉所有类它们是相关的(它们是什么):
我会在团队中放开“Nfl”,因为它会使类的命名变得混乱

class Week < ActiveRecord::Base
  has_many :games
end

class Game < ActiveRecord::Base
  belongs_to :week
  belongs_to :home_team, class_name: "Team", foreign_key: :home_team_id
  belongs_to :away_team, class_name: "Team", foreign_key: :away_team_id
end

class Team < ActiveRecord::Base
  has_many :home_games, class_name: "Game", foreign_key: :home_team_id
  has_many :away_games, class_name: "Game", foreign_key: :away_team_id
end

注意:查看Active Record 关联以更深入地了解它们。


编辑

更正了上面的模型关联并进行了测试以确保它们正常工作:)

确保您具有以下数据库架构来备份关联...

  create_table "games", force: true do |t|
    t.integer  "game_number"
    t.integer  "week_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "home_team_id"
    t.integer  "away_team_id"
  end

  create_table "teams", force: true do |t|
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "weeks", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

编辑: 请注意,当您在 rails 中创建模型时,所有表都默认包含 id 字段


有了这些关联,您现在可以像以前一样在控制器中获取星期:

class WeeksController < ApplicationController

  ...

  def show
    @week = Week.find(params[:id])
    @games = @week.games
  end

  ...

end

最后构建你的视图:
在 WeeksController#show
/views/weeks/show.html.erb

<% if @games.any? %>
  <% render @games %>
<% end %>

这行“渲染@games”将搜索“/views/games/_game.html.erb”并为集合@games中的每个游戏渲染它

*/views/games/_game.html.erb - 部分视图*

<strong> Game <%= game.game_number %>  </strong> <br />
<%= image_tag(game.home_team.imagePath, size: "40") %>
<%= game.home_team.name %>

  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VS
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<%= image_tag(game.away_team.imagePath, size: "40") %>
<%= game.away_team.name %> <br />

就是这样,唯一需要做的就是让模型关联起来并不太难。

于 2013-09-04T19:39:29.683 回答