我喜欢认为我不是 Rails 的新手,但我无法让简单的 Show Action 起作用。我很困惑。 Ruby 2.2.2p95,也在我的生产版本 Ruby 2.0.0p643 和 Rails 4.2.1 上尝试过。
模型是玩家。玩家有 2 个参数,:name 和 :position。当我索引播放器时,它工作正常。但是当我尝试查看 show.html.erb 时,我得到了经典错误:nil:NilClass 的未定义方法“名称”。
玩家模型:
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
方法:
def show
@player = Player.find(params[:id])
end
为了排除故障,我将 show.html.erb 缩减为:
<%= render 'welcome/menu' %>
<%= @player.name %>
一条佣金路线显示:
player GET /players/:id(.:format) players#show
如果我尝试查看 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 View 的重要部分。它工作正常:
<% @players.each do |player| %>
<tr>
<td></td>
<td><%= link_to player.name, player %></td>
<td><%= player.position %></td>
<td><%= player.id %>
玩家 Controller :
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
最佳答案
在 not_picked
方法之后你有一个额外的结束,这是一个错字吗?如果不是,它会直接结束 Controller 并且您的 show 方法根本不会被调用。
关于ruby-on-rails - Rails/Ruby - 非常奇怪,未定义的方法 `name' 为 nil :NilClass on show,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32469808/