Rails способ сделать горизонтальное меню - PullRequest
0 голосов
/ 11 октября 2011

Я хочу спросить вас о лучшем способе создания меню. Я должен сделать горизонтальное меню. Каждая страница принадлежит определенному пункту этого меню, и этот элемент должен иметь 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 голосов
/ 11 октября 2011

Если я правильно понимаю, вы хотите, чтобы это меню появлялось на каждой странице.Если это так, вы можете просто добавить его в свой макет.Если вы не понимаете макеты, прочитайте их в Ruby on Rails Guides http://guides.rubyonrails.org/getting_started.html#customizing-the-layout

0 голосов
/ 11 октября 2011

Я обращаюсь к этому в том, чтобы поместить это в часть навигации:

<%= 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, а также ссылки на параметры в помощнике),Но это работает очень хорошо, и это очень гибкий.

0 голосов
/ 11 октября 2011

Вот как я это делаю:

<%= 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" будет "current", если блок, переданный в menu_item, возвращает true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...