我正在关注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中实现此功能的正确方法是什么?
答案 0 :(得分:11)
消息:
“被调用id为nil,错误地为4 - 如果你真的想要id为nil,请使用object_id”
Rails中的标准邮件是否告诉您尝试在.id
值上调用nil
。
因此,如果@subject
为零,那么在尝试调用@subject.id
时获取该消息是正常的,恰当的行为。
我建议您在视图文件中考虑@subject
可能是nil
,并在提供信息的方式中说明问题。如果@subject
是nil
,请查看代码并考虑您应该在视图中展示的内容。
答案 1 :(得分:2)
没有看到你正在使用的代码我可能是错的。但是你应该使用
params[:id]
要快速检查,只需将其放在if语句之前:
puts ">>> #{params[:subject_id]}"
如果它给你ID,我错了......
答案 2 :(得分:0)
您粘贴的代码可能不会抛出该错误。在您的视图中,您可能会显示@subject.id
,这会抛出该错误。您应该获得一个堆栈跟踪,为您提供问题所在的确切行。