11

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

本教程明确使用 .find_by_id 因为如果结果为 nil 它“不会返回错误”。但是,在尝试查看 @subject 已设置为 nil 的页面时,我得到“为 nil 调用 id,错误地为 4 - 如果您真的想要 nil 的 id,请使用 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 中实现此功能的正确方法是什么?

4

3 回答 3

12

消息:

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

是 Rails 中的标准消息,它告诉您您尝试调用.id一个nil值。

因此,如果@subject为 nil,那么如果您尝试调用@subject.id.

我建议您在视图文件中考虑@subject可能存在nil的问题,并在您呈现信息的方式中解决它。查看代码并思考您应该在视图中呈现的内容(如果有的话@subjectnil

于 2012-06-26T02:48:45.160 回答
2

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

params[:id]

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

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

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

于 2012-06-26T02:41:45.223 回答
0

您粘贴的代码可能不会引发该错误。在您看来,您可能正在显示@subject.id哪个会引发该错误。您应该得到一个堆栈跟踪,它可以为您提供问题所在的确切行。

于 2012-06-26T02:49:43.207 回答