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? %>