为什么出现“undefined method 'each' for nil:NilClass”错误?

18

这是Rails指南的一个例子,点击save post按钮后,控制台会显示以下信息:

Started POST "/posts" for 127.0.0.1 at 2013-12-25 22:42:04 +0800 Processing by PostsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"CLalUww3gqnSlED0AWdou6P/U2qyavPqDiBANQOuYgA=", "post"=>{"title"=>"11", "text"=>"22"}, "commit"=>"Save Post"} (0.0ms) begin transaction (0.0ms) rollback transaction 被重定向到http://127.0.0.1:3000/posts Completed 302 Found in 16ms (ActiveRecord: 0.0ms)

Started GET "/posts" for 127.0.0.1 at 2013-12-25 22:42:04 +0800 Processing by PostsController#index as HTML Rendered posts/index.html.erb within layouts/application (15.6ms) Completed 500 Internal Server Error in 31ms

ActionView::Template::Error (undefined method `each' for nil:NilClass):

        <th>Text</th>
        </tr>
        <% @posts.each do |post| %>

路由没问题,为什么post是nil?Rails 4.0.2 Ruby 2.0


请展示 PostsController#index 的代码。 - Koraktor
谢谢,我知道原因了,我使用了“post”,应该是“posts”。但现在出现了新问题,“undefined method 'title' for nil:NilClass”。 - user3134762
3个回答

35
在您的帖子控制器中,您需要定义@posts,根据您尚未解决的错误。
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end 

@posts未定义,调用each方法将生成undefined method 'each' for nil:NilClass


def index @posts = Post.all end 这段代码中应该是@posts还是@post? - user3134762
4
@ user3134762,请注意你在索引操作中使用了单数的@post,但在视图中却使用了复数的@posts。我建议你将它们统一起来以避免混淆。 - vee

13

为了更详细地解释每当您遇到这个错误时

  undefined method `each' for nil:NilClass

错误显示您在这里(@posts)调用了一个nil对象的每个方法。 这意味着您没有在控制器中定义它。由于您没有定义它,所以它会抱怨未定义的nil类的方法。

请确保在从视图中调用实例变量时检查? 您必须在控制器中定义它才能在视图中访问。

有时,如果您在控制器中调用私有方法,也会出现此错误。


3
尝试替换这个:

<% @posts.each do |post| %>

with

<% Post.all.each do |post| %>

嗨@anosha-rehan,你能扩展一下吗? - Jeremas
嗨@Jeremas,很抱歉,我不幸没有这个特定的项目了。 - anosha_rehan
@anosha-rehan,没问题,谢谢! - Jeremas

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