所以我在http://guides.rubyonrails.org/getting_started.html关注官方ROR教程 我被困在第5.8节,它教我如何列出所有文章
以下是我的控制器和index.html.erb
控制器
class ArticlesController < ApplicationController
def new
end
def create
@article = Article.new(article_params)
@article.save
redirect_to @article
end
def show
@article = Article.find(params[:id])
end
def index
@article = Article.all
end
private
def article_params
params.require(:article).permit(:title, :text)
end
end
index.html.erb
<h1>Listing articles</h1>
<table>
<tr>
<th>Title</th>
<th>Text</th>
</tr>
<% @articles.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
</tr>
<% end %>
</table>
我收到NoMethodError in Articles#index
错误消息
undefined method `each' for nil:NilClass"
出了什么问题?我从字面上复制并粘贴了网站上的代码,看看我做错了什么,但仍无法修复。
答案 0 :(得分:16)
使用@articles
而非@article
def index
@articles = Article.all ## @articles and NOT @article
end
@articles
(复数)在语义上是正确的,因为您要在视图中显示文章集合,而不是单篇文章。
您收到错误
undefined method `each' for nil:NilClass
因为在index
操作中,您已实例化实例变量@article
( NOTICE singular )并且正在使用@articles
( NOTICE复数< / strong>)在index
视图中,即index.html.erb
。因此,在视图中@articles
(复数)将是nil
,因为它从未设置过。因此,错误。
答案 1 :(得分:3)
索引操作
def index
@articles = Article.all
end
OR
def index
@article = Article.all
end
@article 或 @articles 都可以在视图中使用。但这取决于你采取了哪一项指数行动。
如果 @article 被拍摄,那么它应该是
<% @article.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
</tr>
<% end %>
如果 @articles 被采用,那么在视图中它应该是
<% @articles.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
</tr>
<% end %>
注意: - 当它是一个收集方法时,最好采用instancle变量的复数
希望这能让你明白@articles和@article
答案 2 :(得分:2)
写为
<% @article.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
</tr>
<% end %>
您已定义@article
而非@articles
。但好名字是@articles
,因为它意味着所有文章的收集,因此在两个地方都使用它。 如果您未定义并尝试使用任何实例变量,则会返回nil
。现在Nilclass#each
不存在,因此您获得了有效的错误。