文章#index中的Ruby on Rails教程NoMethodError

时间:2014-05-13 18:38:31

标签: ruby-on-rails ruby

所以我在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"

出了什么问题?我从字面上复制并粘贴了网站上的代码,看看我做错了什么,但仍无法修复。

3 个答案:

答案 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不存在,因此您获得了有效的错误。