Rails - 索引视图中的NoMethodError,试图理解ActiveRecord关联

时间:2015-09-09 17:17:14

标签: ruby-on-rails ruby activerecord

我将在下面发布所有相关文件,首先让我解释一下这个问题。我有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 %>

0 个答案:

没有答案