关于表格:Rails 3.1支架nil:NilClass的未定义方法” model_name”

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 Trace

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'

我是使用脚手架生成器创建的,该脚手架生成器在另一个区域对我来说效果很好,但显然不在这里。

以下是相关文件(我对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文件以使用此新名称。