Pages#home中的NoMethodError

alp*_*one 4 ruby-on-rails ruby-on-rails-3

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

Pages#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,> app/views/pages/home.html.erb

如果我从app\views\shared_micropost_form.html.erb <%= render'shared/error_messages',:object => f.object%>中删除以下行,页面将正确呈现

任何帮助表示赞赏.

Jai*_*yer 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 %>
Run Code Online (Sandbox Code Playgroud)

更新:只是为了澄清,上面的答案假设设置@user变量有问题,但没关系.当你:object => f.object在渲染调用中说,你告诉你render采取这个表单所基于的对象,并将其发送到部分 - 使用变量名称object.

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