【问题标题】:NoMethodError in Pages#home页面中的 NoMethodError#home
【发布时间】:2011-04-25 19:14:12
【问题描述】:

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

Pages#home 中的 NoMethodError

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

当你没想到时,你有一个 nil 对象! 您可能期望 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 中删除以下行,页面将正确呈现 f.object %>

感谢任何帮助。

【问题讨论】:

  • 你能显示 app\views\shared_micropost_form.html.erb 的代码吗

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


【解决方案1】:

这是因为您将变量 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 =&gt; f.object 时,您是在告诉 render 获取此表单所基于的对象,并将其发送到局部 - 变量名称为 object

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

【讨论】:

  • 感谢您的解释。我一定错过了第 10 章中重构该部分的部分。
【解决方案2】:

这告诉你@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 中的代码,我们可以告诉您更多信息。

【讨论】:

    【解决方案3】:

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

    我会试试

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

    如果有@user,那么它会检查@user.errors.any

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多