这是一个ruby / rails应用程序 - ruby v 2.1.4,Rails v4.1.14
我觉得我在这里遗漏了一些明显的东西,但似乎无法解决这个问题。我仍然相当擅长Ruby / Rails,因为我确信这一点很明显。
我的应用在标题栏上有一个JS下拉菜单,其中列出了其项目的无序列表。例如:
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
<li><a href="#">EDIT</a></li>
<li><a href="#">DELETE</a></li>
<li><a href="#">CLONE</a></li>
<li><a href="#">EXPORT</a></li>
<li><a href="#">HIDE COMMENTS</a></li>
<li><a href="#">PERMISSIONS</a></li>
<li><a href="#">SHOW DETAIL</a></li>
<li class="divider" role="separator"></li>
</ul>
我希望菜单中的项目列表在每个页面上都有所变化。例如,&#34;项目视图&#34;页面可能包含以上所有内容,但&#34;项目编辑&#34;页面有4个附加选项,&#34;类别&#34;页面只有&#34;编辑&#34;,&#34;删除&#34;和&#34;克隆。&#34;
标题栏有自己的部分,在<%= yield %>
之前从application.erb调用,因此标题栏(和菜单)在每个页面上。它只是需要在每个页面上更改的菜单选项。
我对如何做到这一点的第一个想法是:
在每个页面上定义一个数组(@menulinks)。该数组定义菜单中的内容,如此&#34; link_text =&gt; url_path&#34;:
@menulinks = {'Edit' => '/item/edit/', 'Delete' => '/item/delete/' etc etc}
将数组传递到控制菜单的UL中,在标题栏中部分,如下所示:
%ul.dropdown-menu
- @menulinks.each do |key, value|
%li= link_to key, value
但是有一个问题,因为链接更复杂(我认为我需要使用link_to来调用方法)。因此所需的链接看起来更像是这样(对于&#34;删除&#34;):
= link_to "Delete", item_path(@item), method: :delete, data: {confirm: "Are you sure you want to delete this item?"}
我怎么能把这样的东西传递给UL?链接部分是否可以通过rails在UL中正确解析它来进行转义?
或者我完全过度思考这个问题并且有更简单的方法吗?
答案 0 :(得分:0)
您可以使用before_filter
设置辅助方法,该方法将用于返回链接列表。您甚至可以在ApplicationController
中设置默认值:
class ApplicationController < ActionController::Base
before_filter :setup_menu_links
protected
def setup_menu_links
@menu_link_list = :default_menu_links
end
end
class OtherController < ApplicationController
protected
def setup_menu_links
@menu_link_list = :other_menu_links
end
end
您可以在帮助程序中定义菜单链接列表:
class ApplicationHelper
def default_menu_links
[
link_to('First item', ...),
link_to('Second item', ...)
]
end
end
class OtherHelper
def other_menu_links
[
link_to('Other first', ...),
link_to('Other second', ...)
]
end
end
然后,您的菜单部分可以使用send
调用配置的方法:
%ul.dropdown-menu
- self.send(@menu_link_list).each do |menu_link|
%li= menu_link
只是一个想法。
答案 1 :(得分:0)
我过度思考这个问题。一个解决方案(也许不是最优雅,任何人都有其他想法?):
在单个页面部分中,定义局部变量中的每个链接,如下所示:
del_link = link_to "Delete", item_path(@item), method: :delete, data: {confirm: "Are you sure?"}
edit_link = link_to "Edit", edit_dashboard_path(@dashboard)
然后将它们存储在一个数组中:
@menuitems = [del_link, edit_link]
现在,在包含菜单的标题haml中,使用循环将数组运行到UL中:
%ul.dropdown-menu
- @leftmenuitems.each do |link|
%li= link_to link
这似乎工作正常。