112 votes

Meilleure façon d’ajouter la classe "actuelle" à la navigation dans Rails 3

J'ai des pages statiques dans un menu de navigation. Je souhaite ajouter une classe du type "current" à l'élément en cours d'affichage.

Pour ce faire, j'ajoute des tonnes de méthodes d'assistance (chacune pour un élément) afin de contrôler le contrôleur et l'action.

 def current_root_class
  'class="current"' if controller_name == "homepage" && action_name == "index" 
end

<ul>
  <li <%= current_root_class %>><%= link_to "Home", root_path %>
 

Y a-t-il une meilleure façon de le faire!? Ma façon actuelle est tellement stupide ......

291voto

Skilldrick Points 33002

J'ai créé un assistant appelé nav_link :

 def nav_link(link_text, link_path)
  class_name = current_page?(link_path) ? 'current' : ''

  content_tag(:li, :class => class_name) do
    link_to link_text, link_path
  end
end
 

utilisé comme:

 nav_link 'Home', root_path
 

qui produira HTML comme

 <li class="current"><a href="http://stackoverflow.com/">Home</a></li>
 

74voto

jpemberthy Points 4063

Utilisez l’assistant current_page? pour déterminer si vous devez ou non attribuer la classe "current" .

Notez que vous pouvez également passer un chemin (pas seulement un hachage d'options), par exemple: current_page?(root_path) .

55voto

Yannis Points 3712

Ce n'est pas vraiment une réponse ici, parce que j'utilise la même chose que vous. Je viens de définir des méthodes d'assistance pour tester plusieurs contrôleurs ou actions:

Dans application_helper.rb

   def controller?(*controller)
    controller.include?(params[:controller])
  end

  def action?(*action)
    action.include?(params[:action])
  end
 

Ensuite, vous pouvez utiliser if controller?("homepage") && action?("index", "show") dans vos vues ou autres méthodes d'assistance…

26voto

Peyton Points 221

J'utilise cette fonction nav_link (text, link) dans application_helper.rb (Rails 3) pour faire le travail et me permet de faire défiler les liens de ma barre de navigation de bootstrap twitter 2.0

 def nav_link(text, link)
    recognized = Rails.application.routes.recognize_path(link)
    if recognized[:controller] == params[:controller] && recognized[:action] == params[:action]
        content_tag(:li, :class => "active") do
            link_to( text, link)
        end
    else
        content_tag(:li) do
            link_to( text, link)
        end
    end
end
 

Exemple:

 <%=nav_link("About Us", about_path) %>
 

10voto

fullybaked Points 3202

La façon dont je l'ai fait, il est à ajouter une fonction d'assistance à la application_helper

def current_class?(test_path)
  return 'current' if request.request_uri == test_path
  ''
end

Puis, dans la nav,

<%= link_to 'Home', root_path, :class => current_class?(root_path) %>

Ce teste le lien chemin à contre-courant de la page d'uri et renvoie soit votre classe, ou une chaîne vide.

Je n'ai pas testé à fond et je suis très nouveau pour RoR (déplacement de plus après une décennie avec PHP) donc, si cela a un défaut majeur, je serais ravi de l'entendre.

Au moins de cette façon, vous avez seulement besoin de 1 fonction d'assistance et un simple appel dans chaque lien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X