Pages#home中的NoMethodError

时间:2010-10-15 06:52:06

标签: ruby-on-rails ruby-on-rails-3

我正在通过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;

感谢任何帮助。

3 个答案:

答案 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? %>
相关问题