Rails 3.1 脚手架未定义方法“model_name”为 nil:NilClass
Posted
技术标签:
【中文标题】Rails 3.1 脚手架未定义方法“model_name”为 nil:NilClass【英文标题】:Rails 3.1 Scaffold undefined method `model_name' for nil:NilClass 【发布时间】:2011-11-16 15:36:04 【问题描述】:帮助我 StackOveflow,你是我唯一的希望。
我收到以下错误,这让我发疯。
Players 中的 NoMethodError#new
显示 /home/paul/rails_projects/recruits/app/views/players/_form.html.haml 其中第 1 行提出:
nil:NilClass 的未定义方法 `model_name'
提取的源代码(第 1 行附近):
1: = form_for @player do |f|
2: -if @player.errors.any?
3:#error_explanation
4: %h2= "#pluralize(@player.errors.count, "error") 禁止保存该玩家:"
模板包含的痕迹:app/views/players/new.html.haml
Rails.root:/home/paul/rails_projects/recruits 应用程序跟踪 |框架跟踪 |全程跟踪
app/views/players/_form.html.haml:1:in
_app_views_players__form_html_haml___279577567_106102840' app/views/players/new.html.haml:3:in
_app_views_players_new_html_haml__860668925_106567710' app/controllers/players_controller.rb:29:in `new'
我使用脚手架生成器创建了这个,它在另一个领域对我来说很好,但显然不是在这里。
这里是相关文件(我对脚手架命令生成的文件所做的唯一更改是将 attr_accessable 添加到播放器模型)。
models/player.rb
class Player < ActiveRecord::Base
attr_accessible :first_name, :last_name, :scout_height, :scout_weight,
:scout_profile_url, :scout_star_rating, :scout_overall_ranking,
:scout_position_ranking, :scout_position, :espn_height, :espn_weight,
:espn_profile_url, :espn_star_rating, :espn_overall_ranking,
:espn_position_ranking, :espn_position, :rivals_height, :rivals_weight,
:rivals_profile_url, :rivals_star_rating, :rivals_overall_ranking,
:rivals_position_ranking, :rivals_position, :maxprep_height, :maxprep_weight,
:maxprep_profile_url, :maxprep_star_rating, :maxprep_overall_ranking,
:maxprep_position_ranking, :maxprep_position, :class, :school_commit, :loi_signed
end
控制器/players_controller.rb
class PlayersController < ApplicationController
# GET /players
# GET /players.json
def index
@players = Player.all
respond_to do |format|
format.html # index.html.erb
format.json render json: @players
end
end
# GET /players/1
# GET /players/1.json
def show
@player = Player.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json render json: @player
end
end
# GET /players/new
# GET /players/new.json
def new
@player = Player.new
respond_to do |format|
format.html # new.html.erb
format.json render json: @player
end
end
# GET /players/1/edit
def edit
@player = Player.find(params[:id])
end
# POST /players
# POST /players.json
def create
@player = Player.new(params[:player])
respond_to do |format|
if @player.save
format.html redirect_to @player, notice: 'Player was successfully created.'
format.json render json: @player, status: :created, location: @player
else
format.html render action: "new"
format.json render json: @player.errors, status: :unprocessable_entity
end
end
end
# PUT /players/1
# PUT /players/1.json
def update
@player = Player.find(params[:id])
respond_to do |format|
if @player.update_attributes(params[:player])
format.html redirect_to @player, notice: 'Player was successfully updated.'
format.json head :ok
else
format.html render action: "edit"
format.json render json: @player.errors, status: :unprocessable_entity
end
end
end
# DELETE /players/1
# DELETE /players/1.json
def destroy
@player = Player.find(params[:id])
@player.destroy
respond_to do |format|
format.html redirect_to players_url
format.json head :ok
end
end
end
views/players/new.html.haml
%h1 New player
= render 'form'
= link_to 'Back', players_path
views/players/_form.html.haml
= form_for @player do |f|
-if @player.errors.any?
#error_explanation
%h2= "#pluralize(@player.errors.count, "error") prohibited this player from being saved:"
%ul
- @player.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :first_name
= f.text_field :first_name
.field
= f.label :last_name
= f.text_field :last_name
.field
= f.label :scout_height
= f.number_field :scout_height
.field
= f.label :scout_weight
= f.number_field :scout_weight
.field
= f.label :scout_profile_url
= f.text_field :scout_profile_url
.field
= f.label :scout_star_rating
= f.number_field :scout_star_rating
.field
= f.label :scout_overall_ranking
= f.number_field :scout_overall_ranking
.field
= f.label :scout_position_ranking
= f.number_field :scout_position_ranking
.field
= f.label :scout_position
= f.text_field :scout_position
.field
= f.label :espn_height
= f.number_field :espn_height
.field
= f.label :espn_weight
= f.number_field :espn_weight
.field
= f.label :espn_profile_url
= f.text_field :espn_profile_url
.field
= f.label :espn_star_rating
= f.number_field :espn_star_rating
.field
= f.label :espn_overall_ranking
= f.number_field :espn_overall_ranking
.field
= f.label :espn_position_ranking
= f.number_field :espn_position_ranking
.field
= f.label :espn_position
= f.text_field :espn_position
.field
= f.label :rivals_height
= f.number_field :rivals_height
.field
= f.label :rivals_weight
= f.number_field :rivals_weight
.field
= f.label :rivals_profile_url
= f.text_field :rivals_profile_url
.field
= f.label :rivals_star_rating
= f.number_field :rivals_star_rating
.field
= f.label :rivals_overall_ranking
= f.number_field :rivals_overall_ranking
.field
= f.label :rivals_position_ranking
= f.number_field :rivals_position_ranking
.field
= f.label :rivals_position
= f.text_field :rivals_position
.field
= f.label :maxprep_height
= f.number_field :maxprep_height
.field
= f.label :maxprep_weight
= f.number_field :maxprep_weight
.field
= f.label :maxprep_profile_url
= f.text_field :maxprep_profile_url
.field
= f.label :maxprep_star_rating
= f.number_field :maxprep_star_rating
.field
= f.label :maxprep_overall_ranking
= f.number_field :maxprep_overall_ranking
.field
= f.label :maxprep_position_ranking
= f.number_field :maxprep_position_ranking
.field
= f.label :maxprep_position
= f.text_field :maxprep_position
.field
= f.label :class
= f.number_field :class
.field
= f.label :school_commit
= f.text_field :school_commit
.field
= f.label :loi_signed
= f.check_box :loi_signed
.actions
= f.submit 'Save'
routes.rb
Recruits::Application.routes.draw do
resources :schools
resources :players
#get \"users\/show\"
root :to => "home#index"
devise_for :users
resources :users, :only => :show
end
【问题讨论】:
【参考方案1】:我在这里猜测,但我相信这是因为您为您的 Player 模型提供了一个名为“class”的属性,您应该将其更改为 :player_class 或其他内容。类是保留字。您还应该更新您的 _form.html.erb 和 index.html.erb 和 show.html.erb 文件以使用这个新名称。
【讨论】:
感谢 David,我已更改 Player 模型命名。我已经做了一些其他的事情来解决这个问题,但是回去这似乎可行,所以我很确定这是由于您的建议而不是我的其他解决方法。以上是关于Rails 3.1 脚手架未定义方法“model_name”为 nil:NilClass的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails:未定义的方法 'digest' Rails 教程第 10.1.1 节
RoR - 脚手架 - nil 的未定义方法“to_sym”:NilClass 只有编辑方法中的错误