【问题标题】:Rails - undefined method `model_name' for NilClass:Class in new actionRails - NilClass 的未定义方法“model_name”:新操作中的类
【发布时间】:2012-12-02 19:23:17
【问题描述】:

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

我有模型票

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)

和routes.rb

 resources :tickets do 
  resources :comments
 end

我可以从控制台创建票证,那么问题出在哪里?有人可以建议错误在哪里吗?

【问题讨论】:

  • 你能发布堆栈跟踪的第一行吗?
  • 这很奇怪。你如何渲染 _form 部分?有时变量在局部变量中不可用,这里似乎就是这种情况。
  • 我像以前一样创建了新的空项目(render 'form'),它正在工作。问题,我需要我的旧项目。我试图从部分复制代码,但它不起作用。我需要做什么 ?在新项目工作?但它正在出现问题。
  • 你在new.html.erb 中使用render partial: 'form' 吗?
  • 对不起老兄,我现在没主意了

标签: ruby-on-rails forms actioncontroller


【解决方案1】:

问题是@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
为此,您可能需要关注 this guide,它解释了如何调试 Rails 应用程序。


您可能还想交换这些行。

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

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

【讨论】:

  • 我如何追踪这个?也许重新创建项目会更快,因为我明天需要展示项目。
  • @m_x,我的路线或视图命名中的某些内容。
  • 使用调试器跟踪@ticket变成nil的位置
  • 只要你去localhost:3000/ticket/new 就不用挖路由,你的命名完全没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多