在Rails 4中出现了未定义的方法`errors`。

4

你好,我是一个 Ruby on Rails 初学者,正在使用这个参考文档开发一个小型博客应用程序:http://guides.rubyonrails.org/getting_started.html

我在这里遇到了以下问题。

 <%= form_for :post, url: posts_path do |f| %>
<% if @post.errors.any? %> // Error showing undefined errors method
<div id="errorExplanation">
  <h2><%= pluralize(@post.errors.count, "error") %> prohibited
    this post from being saved:</h2>

我是一个初学者,对这个环境不是很了解。如何解决这个问题?需要帮助。谢谢。


我猜测@post是空的。请发布生成@ post的代码。 - SG 86
请将以下代码添加到您的视图中:<% @post ||= Post.new %> - Rajarshi Das
@rajarshi 谢谢你的解决方案。但是你能否请解释一下它是如何工作的。 - nilkash
是的,只需实例化“Post”对象即可……现在的“funda”是 ||= 它将检查帖子是否已存在,就像在编辑帖子中已存在一样,在您的情况下,由于未实例化“Post”,因此会抛出错误..... - Rajarshi Das
2个回答

12
在你的控制器中:
def new
  @post = Post.new
end 

并且在您的视图中

 <%= form_for :post, url: posts_path do |f| %>
  <% if @post.errors.any? %>
   <div id="errorExplanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited
         this post from being saved:</h2>

是的,你只需要实例化Post对象...在你的情况下,Post没有被实例化,所以会抛出错误。你还应该知道,errors被定义为一个实例方法而不是一个类方法。因此,它将在特定实例上调用。

您可以使用以下链接找到有关活动模型错误的更多信息:

http://api.rubyonrails.org/classes/ActiveModel/Errors.html


在视图中添加这个是一个非常糟糕的建议。通常应该在控制器中完成这项工作。你正在教一个初学者错误的方法。 - Mischa
但是,如果Post不是一个模型,只有控制器和视图呢? - Sahil Babbar

3
在您的控制器中:
def new
  @post = Post.new
end

依据您的看法:

<%= form_for :post, url: posts_path do |f| %>
  <% if @post.errors.any? %>
    <div id="errorExplanation">
      <h2><%= pluralize(@post.errors.count, "error") %> prohibited
          this post from being saved:</h2>

@nilkash,请查看Rajarshi的答案,它更完美。 - user2613217
1
不,你的答案更好。在视图中建议这样做非常糟糕。@badal - Mischa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接