【问题标题】:Undefined Method for nil:NilClassnil:NilClass 的未定义方法
【发布时间】:2011-07-27 07:36:18
【问题描述】:

当用户尝试访问他们的个人资料页面时,我的应用似乎随机抛出 "undefined method 'address_line_1' for nil:NilClass" 错误。

奇怪的是它说错误发生在一个完全不相关的布局视图中,我看不到任何迹象表明布局甚至被调用(因为它与编辑视图无关)。

GET peoplecontacter.heroku.com/pages/5/edit dyno=web.1 queue=0 wait=0ms service=20ms bytes=934
2011-03-31T15:19:47-07:00 app[web.1]: 
2011-03-31T15:19:47-07:00 app[web.1]: ActionView::Template::Error (undefined method `address_line_1' for nil:NilClass):
2011-03-31T15:19:47-07:00 app[web.1]:     44:     #{@page_content.address_line_1}
2011-03-31T15:19:47-07:00 app[web.1]:   app/views/layouts/pages/page_splitheader.html.haml:44:in `_app_views_layouts_pages_page__splitheaderhtml_haml___1138718096_23705833586020_0'

无论我从前面的customer_account 视图单击帐户,还是刚刚单击页面的显示视图并点击浏览器的后退按钮,返回到编辑视图,有时都会引发错误。但是我没有在节目中得到错误,这是@page_content.address_line_1应该执行的唯一地方。

提前感谢您的帮助! --马克

【问题讨论】:

  • 我们必须看一些代码。可以肯定的是,在某些情况下您会得到意外的 nil,这可能是由于错误处理不足。能否请您添加相关代码sn-ps?
  • 当然,但我什至不知道从哪里开始了解您需要查看的内容。
  • 这是我在页面控制器中的编辑操作:def edit @page = Page.find(params[:id]) @page_contents = PageContent.list_by_language(@page.id) end
  • 您的 nil 错误在于 @page_content 对吗?哪个对象有 address_line_1 方法?我想是@page_content。如果是这样,添加初始化它的代码,如果需要,包括控制器和模型。
  • 这是PageContent模型中的方法:def self.list_by_language(page_id) find_all_by_page_id(page_id) end

标签: ruby-on-rails heroku actionview


【解决方案1】:

如果 find_all 没有返回任何页面,它将返回一个 nil 值。看来你没有检查。因此,当返回一个 nil 时,你会得到一个 nil 方法错误。

您必须在程序中处理此类情况并向用户显示错误或在发生这种情况时进行一些处理。

【讨论】:

  • 上面的两个查找都是查找和返回页面。它们都在本地工作,当我通过 Heroku 的控制台运行它时它们都工作,因为页面存在。
  • 当 Heroku 发生实际错误时,他们会返回页面吗?
  • page_splitheader.html 是一个布局文件,只能从一个地方调用——我的页面控制器的显示操作。我的应用程序中唯一包含 address_line_1 的位置是在该布局文件中。我可以看到,如果错误仅在来自显示操作时发生(当点击后退按钮返回编辑时),它可能是相关的,但它也发生在我什至没有显示时......跨度>
  • 他们不会将它们返回给浏览器,不。只是标准的生产错误页面。不过,在随后的日志中,我看到: 2011-03-31T15:30:31-07:00 heroku[router]: GET peoplecontacter.heroku.com/pages/6/edit dyno=web.1 queue=0 wait= 0ms 服务=29ms 字节=934 2011-03-31T15:30:31-07:00 heroku[nginx]: GET /pages/6/edit HTTP/1.1 | 24.8.213.105 |第964章http | 500 2011-03-31T15:30:31-07:00 heroku[路由器]: GET peoplecontacter.heroku.com/favicon.ico dyno=web.1 queue=0 wait=0ms service=1ms bytes=225
  • 尝试删除产生错误的行并执行 以查看它是否为 nil。
【解决方案2】:

好的,完全随机,我仍然不知道问题的原因是什么,但解决方法是显式设置编辑操作的布局,以便它使用默认布局,而不是使用我为显示操作指定的布局。我不知道为什么,当来自另一个控制器或从显示页面返回到编辑页面时,它会尝试使用我仅用于显示页面的动态布局。

在我的 Pages 控制器的顶部,我有这个: before_filter :load_page, :only => :show def load_page @page = Page.get_page(params) self.class.layout(@page.template) end 我想这是为动作分配动态布局的正确方法,但是由于不使用(我认为)一个hacky解决方案就无法工作,也许它不是......

【讨论】:

    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多