每个页面包含不同链接的下拉菜单

时间:2016-02-19 17:16:18

标签: javascript ruby-on-rails ruby

这是一个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调用,因此标题栏(和菜单)在每个页面上。它只是需要在每个页面上更改的菜单选项

我对如何做到这一点的第一个想法是:

  1. 在每个页面上定义一个数组(@menulinks)。该数组定义菜单中的内容,如此&#34; link_text =&gt; url_path&#34;:

    @menulinks = {'Edit' => '/item/edit/', 'Delete' => '/item/delete/' etc etc}
    
  2. 将数组传递到控制菜单的UL中,在标题栏中部分,如下所示:

    %ul.dropdown-menu
      - @menulinks.each do |key, value|
      %li= link_to key, value
    
  3. 但是有一个问题,因为链接更复杂(我认为我需要使用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中正确解析它来进行转义?

    或者我完全过度思考这个问题并且有更简单的方法吗?

2 个答案:

答案 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

这似乎工作正常。