Rails方式制作水平菜单

时间:2011-10-11 06:51:28

标签: ruby-on-rails

我想问你关于创建菜单的最佳rails方法。 我应该做一个横向菜单。每个页面都属于此菜单的特定项目,当用户在此页面上打开时,此项目应具有id =“current”。

<ul>
  <li id="current">Home</li>
  <li>About us</li>
</ul>

据我所知,我应该创建一个特殊的帮助器来创建这个html标记,并在每个页面的每个视图上使用带有特殊参数的帮助器。也许有更好的轨道方式来做到这一点?


PS。更新

我的解决方案:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :open_most_important

  protected
    def open_most_important
      @menu = {  
        :cases => { :name => 'Cases', :link => '/cases'}, 
        :groups => { :name => 'Groups', :link => '/groups' }, 
        :projects => { :name => 'Projects', :link => '/projects' }, 
        :settings => { :name => 'Settings', :link => '/settings' }, 
        :about => { :name => 'About us', :link => '/about' }}
      @current_menu_item = :cases
    end

布局application.html.erb的片段:

<div id="menu">
  <ul>
    <% @menu.each do |item, value| -%>
      <% if @current_menu_item == item -%>
        <li id="current"><a href="<%= value[:link] %>"><%= value[:name] %></a></li>
      <% else -%>
        <li><a href="<%= value[:link] %>"><%= value[:name] %></a></li>
      <% end -%>
    <% end -%>
  </ul>
</div>

我需要为@current_menu_item

中的每个控制器设置before_filter

3 个答案:

答案 0 :(得分:0)

这就是我倾向于这样做的方式:

<%= menu_item("Home", root_path) {
      controller.controller_name == "pages" &&
      controller.action_name = "home" } %>
<%= menu_item("About us", page_path("about") {
      controller.controller_name == "pages" &&
      controller.action_name == "about" } %>

帮助者:

def menu_item(name, url, options = {})
  if yield
    options["id"] = "current"
  end

  link_to name, url, options
end

如果传递给"id"的块返回true,则"current"将为menu_item

答案 1 :(得分:0)

如果我理解正确,您希望此菜单出现在每个页面上。如果是这种情况,您可以将其添加到您的布局中。如果您不理解在Ruby on Rails指南http://guides.rubyonrails.org/getting_started.html#customizing-the-layout

上阅读的布局

答案 2 :(得分:0)

我处理它的方法是将它放在导航部分中:

<%= nav_link "All Users", users_path, active_tabs.include?('all_users') %>
<%= nav_link "Add User", new_user_path, active_tabs.include?('add_user') %>

然后这个助手位于每个视图的顶部:

<%= nav 'nav_partials/users_tabs', 'all_users' %> # one view
<%= nav 'nav_partials/users_tabs', 'add_user' %> # another view

帮助者:

  def nav_link(title, path, active, options = {})
    if active
      options[:class] ? options[:class] += " active" : options[:class] = "active"
    end
    link_to(title, path, options)
  end

  def nav(partial, *active_tabs)
    partial = "#{params[:controller]}/nav_partials/#{partial}" unless partial.chars.first == '/'
    render :partial => partial, :locals => { :active_tabs => active_tabs }
  end

对我而言,它很优雅,即使有些东西可能会更好一点(比如nav助手中的文件路径,以及在助手中引用params)。但它的效果非常好,而且非常灵活。