Ruby on rails Rails/Ruby-非常奇怪,未定义nil:NilClass的方法'name'

Ruby on rails Rails/Ruby-非常奇怪,未定义nil:NilClass的方法'name',ruby-on-rails,ruby,Ruby On Rails,Ruby,我喜欢认为我对rails不是一个完全的新手,但我不能让一个简单的表演动作起作用。我很困惑。Ruby 2.2.2p95,也在我的产品版本Ruby 2.0.0p643上试用过,这两个版本都是Rails 4.2.1 模式是玩家。玩家有两个参数:名字和位置。当我为玩家编制索引时,效果很好。但是当我尝试查看show.html.erb时,我得到了一个典型错误:nil:NilClass的未定义方法'name' 玩家模型: class Player < ActiveRecord::Base has_one

我喜欢认为我对rails不是一个完全的新手,但我不能让一个简单的表演动作起作用。我很困惑。Ruby 2.2.2p95,也在我的产品版本Ruby 2.0.0p643上试用过,这两个版本都是Rails 4.2.1

模式是玩家。玩家有两个参数:名字和位置。当我为玩家编制索引时,效果很好。但是当我尝试查看show.html.erb时,我得到了一个典型错误:nil:NilClass的未定义方法'name'

玩家模型:

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
为了排除故障,我将show.html.erb简化为:

 <%= render 'welcome/menu' %>

 <%= @player.name %>
如果我尝试查看id为269的播放器,日志显示的就是这个

 Started GET "/players/269" for ::1 at 2015-09-08 21:58:12 -0400
 Processing by PlayersController#show as HTML
 Parameters: {"id"=>"269"}
 Rendered welcome/_menu.html.erb (0.7ms)
 Rendered players/show.html.erb within layouts/application (5.7ms)
 Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.0ms)

 ActionView::Template::Error (undefined method `name' for nil:NilClass):
  2: 
  3: <%= render 'welcome/menu' %>
  4: 
  5: <%= @player.name %>
  6:      
 app/views/players/show.html.erb:5:in `_app_views_players_show_html_erb___175427692043794239_70253361597080'
我到底错过了什么

编辑:

这是index.html.erb视图的重要部分。它工作得很好:

   <% @players.each do |player| %>
   <tr>
   <td></td>
    <td><%= link_to player.name, player %></td>
    <td><%= player.position %></td>
    <td><%= player.id %>
玩家控制器:

 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
 end

def show
 @player = Player.find(params[:id])
end

 private

 def player_params
 params.require(:player).permit(:name, :position)
 end
因为找不到记录时,find方法将返回ActiveRecord::RecordNotFound。所以我猜你的数据库里有玩家记录

我建议您在@player=player.findparams[:id]之后使用p@player,然后在show.html.erb的第一行中执行相同的操作,以显示@player是什么


也许有什么东西把@player改成了nil。

你的代码看起来不错,但我猜你的代码中有什么东西使@player变量为nil

我将建议以下步骤,包括:

1-控制器中@player之后的调试器

def show
  @player = Player.find(params[:id])
  binding.pry
end
检查您的代码,看看是否有@player对象

2-添加调试器以显示视图

<% binding.pry %>
<%= @player.name %>
看看你是否还有@player,通过这个你可以理解你什么时候丢失了这个值,然后继续努力


我的猜测是,控制器中的某些过滤器可能正在清除您的变量

在未选择的方法之后,您有一个额外的结尾,这是打字错误吗?如果没有,它实际上会结束控制器,并且根本不会调用show方法。

您说索引有效。你能把密码寄出去吗?另外,尝试在控制台上创建一个播放器:rails c,然后Player=Player。创建{name:name,position:position},然后访问name属性:Player.name并查看它是否工作。Player对象首先存在吗?在你的show动作和show.html.erb中p@player的输出是什么?添加了索引视图和控制器方法。你能发布整个控制器吗?您还可以进入控制台并运行“Player.find269”,确保返回一条记录。旁注:您可以在从数据库中取出记录后使用ruby进行排序。您最好使用ActiveRecord执行数据库级别的排序。如果id不在数据库中,正如您所说,它将返回ActiveRecord::RecordNotFound。然而,在这一点上,rails将爆炸,根本不会渲染视图。谢谢Sameera!谢谢你没有取笑我的愚蠢:D@SeattleDucati一段时间后,它被称为经验
def show
  @player = Player.find(params[:id])
  binding.pry
end
<% binding.pry %>
<%= @player.name %>