Rails 3.0 / 3.2:被调用id为nil,这将错误地为4 - 如果你真的想要id为nil,请使用object_id

时间:2012-06-26 02:16:38

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我正在关注Kevin Skoglund教程Ruby on Rails 3 Essential Training,它是为rails 3.0编写的,尽管我目前正在使用3.2。它使用带有before_filter的pages_controller中的以下方法,仅显示属于父主题的页面。

该教程明确使用.find_by_id,因为如果结果为nil,则“不会返回错误”。但是,当我尝试查看@subject设置为nil的页面时,我得到“被调用的id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id”错误。

def find_subject
  if params[:subject_id]
    @subject = Subject.find_by_id(params[:subject_id])
  end
end

导致错误的实际代码是:

def list
  @pages = Page.order("pages.position ASC").where(:subject_id => @subject.id)
end

这是自3.0以来发生了什么变化吗?如果是这样,在3.2中实现此功能的正确方法是什么?

3 个答案:

答案 0 :(得分:11)

消息:

  

“被调用id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id”

Rails中的标准邮件是否告诉您尝试在.id值上调用nil

因此,如果@subject为零,那么在尝试调用@subject.id时获取该消息是正常的,恰当的行为。

我建议您在视图文件中考虑@subject可能是nil,并在提供信息的方式中说明问题。如果@subjectnil,请查看代码并考虑您应该在视图中展示的内容。

答案 1 :(得分:2)

没有看到你正在使用的代码我可能是错的。但是你应该使用

params[:id]

要快速检查,只需将其放在if语句之前:

puts ">>> #{params[:subject_id]}"

如果它给你ID,我错了......

答案 2 :(得分:0)

您粘贴的代码可能不会抛出该错误。在您的视图中,您可能会显示@subject.id,这会抛出该错误。您应该获得一个堆栈跟踪,为您提供问题所在的确切行。