Rails undefined方法`each'代表nil:NilClass ......但是它被定义了

时间:2015-06-13 20:15:33

标签: ruby-on-rails each

我已经搜索了几个小时,尝试了所有可能的解决办法。我无法做到这一点。错误是:

  *NoMethodError in Articles#index
  Showing /Users/myname/blog/app/views/articles/showall.html.erb where     line #21 raised:
undefined method `each' for nil:NilClass*

showall.html.erb是一个视图。它是从“文章”控制器呈现的。 (均在下面发布)。 showall的路线,它工作正常。目前路由配置为:

get 'article/showall'

但是,我也尝试过:

resources :articles do
  get 'showall'
resources :comments

这两条路线都有效,但都没有对这个问题产生影响。

控制器中有一个方法,它不是私有的:

def showall
   @articles = Article.all
end

视图中有问题的代码是:

 <% @articles.each do |article| %>
 <tr>
  <td><%= article.title.truncate(30) %></td>
  <td><%= article.author %></td>
  <td><%= article.manufacturer %></td>
  <td><%= article.model %></td>
  <td><%= article.displacement %></td>`

<% end %>

我实际上剪切并粘贴了index.html.erb视图中的一段代码,它完美地运行。我已经尝试过我能想到的每一个多元化的细微差别。任何帮助将不胜感激。

控制器的这个适用部分:

class ArticlesController < ApplicationController
 skip_before_action :authorize, only: [:index, :show, :showall]

 #Filter used to catch nonlogged in users 
 before_filter :require_user, :only => [:index]

#method that checks if logged in, sends them to showall if not.
def require_user
unless User.find_by(id: session[:user_id])
  render 'showall', :notice => "Please log in to read articles."
end
end

def index

@articles = current_user.articles

end

#should list articles, but throws undefined method 'each' error
def showall
@articles = Article.all
end

以下是整个视图:      

 <%= render "menu" %>

 <body>
 <font color="yellow"><%= flash[:notice] %></font>
 <br>
 <font color="grey">Motorcycle Articles</font>
 <%= link_to 'Post New Article', new_article_path %> 
 <br>

 <table>
 <tr>
 <th>Title</th>

 <th>Author</th>
 <th>Brand</th>
 <th>Model</th>
 <th>Displacment</th>
 <th>Last Edited On:</th>
 <th>Article</th>
 </tr>
 <% @articles.each do |article| %>
  <tr>
  <td><%= article.title.truncate(30) %></td>
  <td><%= article.author %></td>
  <td><%= article.manufacturer %></td>
  <td><%= article.model %></td>
  <td><%= article.displacement %></td>

  <% end %>
  </table>
  <br>
   All articles are property of their respective owners.

 </body>

3 个答案:

答案 0 :(得分:1)

路由触发索引操作,请参阅:

NoMethodError in Articles#index

您收到错误,因为current_user.articles为零。

您需要确保Articles#showall出现在日志中,这意味着调用了showall方法。

创建路线:

get '/articles', to: 'Articles#showall'
resources :articles

不建议这样做。有几个部分需要改进。但它应该使错误消失。

答案 1 :(得分:0)

您正在调用渲染'showall',它会渲染视图。这与调用控制器操作的'redirect_to'不同。由于您使用nil值设置@articles的值(未设置current_user),因此会出现此错误。

为了澄清,您需要重定向到'showall'动作,或者在渲染视图之前将@articles重新定义为等于Article.all。就个人而言,我会重定向。

答案 2 :(得分:0)

修改您的routes文件

的routes.rb

resources :articles do
  collection do
    get 'showall'
  end
end