Rails 3.1 Scaffold undefined method `model_name' for nil:NilClass
帮助我StackOveflow,您是我唯一的希望。
我遇到以下错误,这使我发疯。
NoMethodError in Players#new
Showing /home/paul/rails_projects/recruits/app/views/players/_form.html.haml where line #1 raised:
undefined method `model_name' for nil:NilClass
Extracted source (around line #1):
1: = form_for @player do |f|
2: -if @player.errors.any?
3: #error_explanation
4: %h2="#{pluralize(@player.errors.count,"error")} prohibited this player from being saved:"
Trace of template inclusion: app/views/players/new.html.haml
Rails.root: /home/paul/rails_projects/recruits
Application Trace | Framework Trace | Full Traceapp/views/players/_form.html.haml:1:in
_app_views_players__form_html_haml___279577567_106102840' _app_views_players_new_html_haml__860668925_106567710'
app/views/players/new.html.haml:3:in
app/controllers/players_controller.rb:29:in `new'
我是使用脚手架生成器创建的,该脚手架生成器在另一个区域对我来说效果很好,但显然不在这里。
以下是相关文件(我对scaffold命令生成的文件所做的唯一更改是将attr_accessable添加到播放器模型)。
models / player.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
controllers / players_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 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
1 2 3 4 5 | %h1 New player = render 'form' = link_to 'Back', players_path |
views / players / _form.html.haml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | = 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
1 2 3 4 5 6 7 8 9 10 11 12 | Recruits::Application.routes.draw do resources :schools resources :players #get "users\\/show" root :to =>"home#index" devise_for :users resources :users, :only => :show end |
我在这里猜测,但我相信这是因为您给Player模型赋予了一个名为" class "的属性,您应该将其更改为:player_class或其他名称。类是保留字。您还应该更新_form.html.erb和index.html.erb和show.html.erb文件以使用此新名称。