Rails - 未定义的方法"model_name",用于 NilClass:New Action 中的类



我不知道为什么,但我的新视图开始崩溃。

我有模型票

class Ticket < ActiveRecord::Base
attr_accessible :body, :department, :email, :name, :reference, :subject, :status
has_many :replies, :dependent => :destroy

和简单的新动作

def new
logger.debug "#{@ticket}"
@ticket = Ticket.new
respond_to do |format|
format.html # new.html.erb
format.json { render json: @ticket }
end
end

和new.haml.html(抱歉haml格式错误):

= form_for @ticket do |f|
- if @ticket.errors.any?
#error_explanation
%h2= "#{pluralize(@ticket.errors.count, "error")} prohibited this ticket from being saved:"
%ul
- @ticket.errors.full_messages.each do |msg|
%li= msg
.field
= f.label :name
= f.text_field :name
.field
- if current_admin
= f.label :email
= f.text_field :email, :value => "#{current_admin.email}", :disabled => :true
- else
= f.label :email
= f.text_field :email
.field
= f.label :department
= f.select :department, options_for_select(["First department","Second department","Third department"])
.field
= f.label :subject
= f.text_field :subject
.field
= f.label :body
= f.text_area :body
- if current_admin
.field
= f.label :status
= f.select :status, options_for_select(["Waiting for Staff Response","Waiting for Customer","On Hold", "Cancelled", "Completed"])
.actions
= f.submit 'Save'

错误:

ActionView::Template::Error (undefined method `model_name' for NilClass:Class):
1: = form_for @ticket do |f|
2:   - if @ticket.errors.any?
3:     #error_explanation
4:       %h2= "#{pluralize(@ticket.errors.count, "error")} prohibited this ticket from being saved:"
app/views/tickets/_form.html.haml:1:in   
`_app_views_tickets__form_html_haml__659380982_96991070'
Rendered /home/denmed/.rvm/gems/ruby-1.9.2-p320/gems/actionpack-3.2.8/lib
/action_dispatch/middleware/templates/rescues/_trace.erb (5.9ms)
Rendered /home/denmed/.rvm/gems/ruby-1.9.2-p320/gems/actionpack-3.2.8/lib
/action_dispatch/middleware/templates/rescues/_request_and_response.erb (4.1ms)
Rendered /home/denmed/.rvm/gems/ruby-1.9.2-p320/gems/actionpack-3.2.8/lib
/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (42.2ms)

和路线。rb

resources :tickets do 
resources :comments
end

我可以从控制台创建Ticket,所以问题在哪里?有人能建议哪里有错误吗?

问题是@ticket以某种方式被"苯胺化"。这是因为当你查看form_for 内部时

def form_for(record, options = {}, &proc)
# .... 
object = record.is_a?(Array) ? record.last : record
object_name = options[:as] || ActiveModel::Naming.param_key(object)
# ....
end

在调用ActiveModel::Naming.param_key(object)的地方,我们最终使用以下方法

def model_name_from_record_or_class(record_or_class)
(record_or_class.is_a?(Class) ? record_or_class : record_or_class.class).model_name
end

在那里,你可以看到,如果你将nil传递给这个方法,它会抛出你发布的错误-所以请检查@ticket在哪里以及为什么获得nil
要做到这一点,你可能需要遵循本指南,它解释了如何调试rails应用程序。


您可能还想交换这些线路。

def new
logger.debug "#{@ticket}"
@ticket = Ticket.new
end

因为按照现在的方式,你不会得到任何有用的输出。

相关内容

最新更新