我正在尝试在我的应用上获得自定义下拉菜单,以便我的每个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_controller
在lists#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
中让我在所有页面的菜单中识别出这一点?
答案 0 :(得分:0)
我想我知道这里有什么问题。我认为你错误地使用了application.html.erb
。
application.html.erb
通常用于放置将在您的所有网页上显示的html。以标题菜单为例。
对于您的列表,我认为您希望在index
操作上显示您的链接,即“app / views / list / index.html.erb&#39;。
所以我会这样做:
def application
移除application_controller
方法。 index.html.erb
文件。application.html.erb
至app/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.....
另外(作为旁白)您可能希望将此标题信息移动到部分以保持您的布局文件清洁,但这实际上不是答案的一部分:)
希望这有帮助!