Ruby on Rails错误:评估nil.each时发生错误

时间:2010-12-02 16:01:34

标签: ruby-on-rails ruby null

我正在尝试学习Ruby,但我发现了这个错误:

评估nil.each时发生错误

我在这里阅读“入门”指南http://guides.rubyonrails.org/getting_started.html

以下是index.html.erb的一段代码:

<h1>Listing snippets</h1>
<div class="snippets">
<% @posts.each do |post| %>
    <h2><%= post.title %></h2>
    <p><%= link_to 'View', post %> | <%= link_to 'Edit', edit_post_path(post) %> | <%= link_to 'Delete', post, :confirm => 'Are you sure?', :method => :delete %></p>
<% end %>
</div>

现在 @posts var posts_controller.rb

def index
    @posts = Post.all

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

我做错了什么? 感谢。

PS:我看到它们显示在 http://127.0.0.1:3000/posts 但是如果我想在根文件夹中显示它们( http:// 127.0.0.1:3000 /

3 个答案:

答案 0 :(得分:2)

你应该制作一个partial并将该帖子逻辑放在其中。

然后,只要在每个使用过的控制器操作中初始化集合,就可以将它放在任何视图上。

所以在您的家庭控制器中,您仍然需要:

@posts = Post.find(:all)

就您的第一个问题而言,请尝试通过@posts = Post.find(:all)

找到它们

答案 1 :(得分:1)

添加路由到routes.rb(仅适用于Rails 2.x):

map.root :controller => "posts", :action => "index"

对于Rails 3.x看看这里: http://guides.rubyonrails.org/routing.html#using-root

评估nil.each时发生错误意味着@posts不是数组。你创建了一个帖子表吗?

答案 2 :(得分:1)

错误是(您可能怀疑)在以下行中发生:

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

不管怎样,@ post最终都是零,即使我们希望它是一个列表。

这有点奇怪,因为上面的代码看起来应该有效。我会尽力帮你找出问题。

Post.all相当于Post.find(:all),根据the documentation for find,它可以返回nil,但我不知道这在实践中何时会发生。通常,如果数据库中没有帖子,则应返回空列表([]),如果数据库表根本不存在则引发异常。

因此,如果Post.all以某种方式返回nil,请在控制器中尝试@posts = []而不是@posts = Post.all.each应该可以正常工作。

如果(我怀疑),它没有,我的猜测是,某种程度上与你上面发布的控制器不同的控制器被执行。然后,因为从未设置@posts,尝试访问它只会给你nil,这解释了错误。因此,请检查您的路径和类名,并确保您认为运行实际的代码运行。

希望能帮助您弄清楚出了什么问题 - 让我们知道是什么解决了这个问题!