我将在下面发布所有相关文件,首先让我解释一下这个问题。我有3个模特,球员,球队和所有权。玩家和团队都拥有自己的所有权。玩家通过他们与所有权的关系(has_one:团队,通过::所有权)拥有:团队。
如果我使用show动作显示播放器,我可以访问Team的所有属性,包括作为回形针附件的徽标。
如果我使用索引操作显示所有玩家,则无法访问任何Team属性。如果我像这样显示团队,<%= player.team%> ,它显示一个像这样的对象引用#Team:0x007fef0b68cb10。如果我尝试访问Team的属性,<%= player.team.name%>,我会得到:
NoMethodError in Players#index undefined method `name' for nil:NilClass
我的问题是:如何为玩家创建索引方法,以便我可以在索引视图中显示Team的属性?
我尝试将索引方法更改为以下内容:
def index
@players = Player.all.sort_by{ |x| [x.position, x.last_name] }
@Team = Player.team
end
但是
失败了 undefined method `team' for #
模特:
class Player < ActiveRecord::Base
has_one :team, through: :ownership
has_one :ownership
validates :name, presence: true
validates :position, presence: true
def last_name
self.name.split(' ')[1]
end
end
class Ownership < ActiveRecord::Base
belongs_to :player
belongs_to :team
validates :round, :pick, :team_id, presence: true
end
class Team < ActiveRecord::Base
has_many :ownerships
has_many :players, through: :ownerships
validates :name, presence: true
validates :division, presence: true
has_attached_file :logo , :styles => { :small => '10>', :medium => '40>', :large => '60>' }
validates_attachment_content_type :logo, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]
end
球员控制器:
class PlayersController < ApplicationController
def index
@players = Player.all.sort_by{ |x| [x.position, x.last_name] }
end
def not_picked
@players = Player.all.select { |m| m.team == nil}.sort_by{ |x| [x.position, x.last_name] }
end
def show
@player = Player.find(params[:id])
end
private
def player_params
params.require(:player).permit(:name, :position)
end
end
玩家的相关部分index.html.erb:
<% @players.each do |player| %>
<tr>
<td></td>
<td><%= link_to player.name, player %></td>
<td><%= player.position %></td>
<td><%= player.team.name %> </td> <!--This throws the error -->
玩家show.html.erb(工作正常):
<%= render 'welcome/menu' %>
<%= @player.name %>
<%= @player.team.name %>
<%= @player.ownership.pick %>
<%= @player.ownership.round %>