Pages#home中的NoMethodError

我正在通过railtutorial.org在线书籍中找到rails 3.我已经完成了第11章的大部分内容,我们在其中添加了提交微博的function。 添加适当的代码后,我无法呈现页面。 以下是返回的错误:
>

Pages#home中的NoMethodError

显示c:/rails_projects/sample_app/app/views/shared/_error_messages.html.erb,其中>#1行:

当你没想到它时,你有一个零对象! 您可能期望ActiveRecord :: Base的实例。 在评估nil.errors提取的源(第1行附近)时发生错误:

1:
2:


3:


4: prohibited this
模板包含跟踪:app / views / shared / _micropost_form.html.erb,> app / views / pages / home.html.erb

如果我从app \ views \ shared_micropost_form.html.erb f.object%>中删除以下行,页面将正确呈现

任何帮助表示赞赏。

这是因为你将一个变量object传递给你的部分,但在部分你试图使用一个名为@user的变量。 将该部分中的@user每个实例更改为object ,它将正常工作。

 1:<% if object.errors.any? %> 2:
3:

<%= pluralize(object.errors.count, "error") %> 4:prohibited this <%= object.class.to_s.underscore.humanize.downcase %>

更新:只是澄清一下,上面的答案假设设置@user变量有问题,但没关系。 当您在渲染调用中说:object => f.object时,您告诉render器获取此表单所基于的对象,并使用变量名称object将其发送到partial。

将错误代码重构为共享部分的重点在于,对于不同的模型,它将由多个表单使用。 在部分内部你不能说@user因为你将对所有其他模型使用相同的部分。 这就是为什么partial中的代码被更改为使用更通用的变量名称object

这告诉你@user对象是nil。 您应确保在控制器pages#home @user实际为@user设置了值。 如果您在抢救表单post上的错误后重定向到主页,那么在重定向后您仍然不会将实例变为@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中的代码,那么我们可以告诉你更多。

似乎您正在访问的控制器操作中没有@user变量

我试试

 <% if @user && @user.errors.any? %> 

如果有@user,则会检查@ user.errors.any

另外,如果你正在使用设计,你可以试试

 <% user_signed_in? && @user.errors.any? %>