未定义的方法`每个' for nil:在application.html.erb上显示NilClass

时间:2016-06-07 19:46:52

标签: ruby-on-rails

我正在尝试在我的应用上获得自定义下拉菜单,以便我的每个list实例在导航上都有自己的链接。到目前为止我的application.html.erb

         <li class="dropdown">
            <a href="/lists" class="dropdown-toggle" data-toggle="dropdown">My Lists<b class="caret"></b></a>
            <ul class="dropdown-menu">
              <li><%= link_to "All Lists", lists_path %></li>
              <% @lists.each do |list|%>
                <li><%= link_to list_path(list) do %>
                  <%= list.name %>
                <% end %></li>
              <% end %>
            </ul>
          </li>

但是,现在我在undefined method 'each' for nil:NilClass的行上收到错误@lists.each do |list|。我知道这个(或类似的)结构在另一个页面上工作,所以我认为它必须与控制器有关。我的lists_controllerlists#index页面上使用以下定义正确执行此操作:

class ListsController < ApplicationController
  def index
    @lists = List.all
    @list = List.new
  end
...

我的application_controller目前正在反映这一点:

def application
  @lists = List.all
  @list = List.new
end

但我很确定这不对。我应该在我的application_controller中让我在所有页面的菜单中识别出这一点?

2 个答案:

答案 0 :(得分:0)

我想我知道这里有什么问题。我认为你错误地使用了application.html.erb

application.html.erb通常用于放置将在您的所有网页上显示的html。以标题菜单为例。

对于您的列表,我认为您希望在index操作上显示您的链接,即“app / views / list / index.html.erb&#39;。

所以我会这样做:

  • def application移除application_controller方法。
  • 为app / views / list`目录创建一个index.html.erb文件。
  • 现在将您的代码转移到application.html.erbapp/views/list/index.html.erb

应该这样做。

答案 1 :(得分:0)

首先,每次在您的应用上呈现页面时都要小心执行List查询,并且如果可能的话,请缓存查询或使用手动链接以避免任何性能问题。

有人说......

您有一些选项,其中一个是application_controller中的before_action,用于设置您想要呈现的任何instance_variables。

ApplicationController < ActionController::Base
  before_action :set_lists

  def set_lists
    @lists = List.all
  end
end

您还可以向ApplicationHelper文件添加dropdown_lists方法,类似于:

def dropdown_lists
  List.all
end

您可以在视图中用@lists代替dropdown_lists.each.....

另外(作为旁白)您可能希望将此标题信息移动到部分以保持您的布局文件清洁,但这实际上不是答案的一部分:)

希望这有帮助!