我正在通过railtutorial.org在线预订rails 3。
我已经完成了第11章的大部分内容,我们在其中添加了提交微博的功能。添加适当的代码后,我无法呈现页面。以下是返回的错误:
>
页面#home
中的NoMethodError显示c:/rails_projects/sample_app/app/views/shared/_error_messages.html.erb,其中>#1引发了行:
当你没想到它时,你有一个零对象! 您可能期望ActiveRecord :: Base的实例。 评估nil.errors时发生错误 提取的来源(第1行):
1:
<% if @user.errors.any? %>
2:<div id="error_explanation">
3:<h2><%= pluralize(@user.errors.count, "error") %>
4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>
模板包含跟踪:app / views / shared / _micropost_form.html.erb,&gt; app / views / pages / home.html.erb
如果我从app \ views \ shared_micropost_form.html.erb中删除以下行,页面将正确呈现 &lt;%= render'shared / error_messages',:object =&gt; f.object%&gt;
感谢任何帮助。
答案 0 :(得分:9)
这是因为你将一个变量object
传递给你的部分,但在部分你试图使用一个名为@user
的变量。将该部分@user
中的每个实例更改为object
,它将正常工作。
1:<% if object.errors.any? %>
2:<div id="error_explanation">
3:<h2><%= pluralize(object.errors.count, "error") %>
4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>
更新:为了澄清,上面的答案假设设置@user变量有问题,但没关系。当您在渲染调用中说:object => f.object
时,您告诉render
获取此表单所基于的对象,并使用变量名object
将其发送到部分对象。
将错误代码重构为共享部分的重点在于,对于不同的模型,多个形式将使用它。在部分内部你不能说@user
,因为你将对所有其他模型使用相同的部分。这就是为什么部分代码被更改为使用更通用的变量名object
。
答案 1 :(得分:0)
这告诉你@user
对象是零。您应确保在控制器pages#home
中确实为@user
设置了值。如果您在抢救表单帖子上的错误后重定向到主页,那么在重定向后您仍然不会将实例变为@user。最常见的做法是,如果您希望在表单发布错误消息中包含原始发布值以呈现视图,那么您仍然可以使用已发布的参数:
# Some controller
def create
begin
@user = User.create(params[:user])
rescue ActiveRecord::RecordInvalid => e
@errors => e.record.full_error_messages
render :action => "new"
end
end
我不确定教程是做什么的,但是如果你发布了pages_controller #home中的代码,那么我们可以告诉你更多。
答案 2 :(得分:0)
您正在访问的控制器操作中似乎没有@user变量
我试试
<% if @user && @user.errors.any? %>
如果有@user,则会检查@ user.errors.any
另外,如果你正在使用设计,你可以尝试
<% user_signed_in? && @user.errors.any? %>