我正在尝试学习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 / )
答案 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,这解释了错误。因此,请检查您的路径和类名,并确保您认为运行实际的代码运行。
希望能帮助您弄清楚出了什么问题 - 让我们知道是什么解决了这个问题!