J'ai des pages statiques dans un menu de navigation. Je veux ajouter une classe comme "courant" à l'élément qui est actuellement affiché.
La façon dont je le fais est d'ajouter des tonnes de méthodes d'assistance (chacune pour un élément) pour vérifier 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 ......
navigation
ruby-on-rails-3
PeterWong
la source
la source
controller_name
etaction_name
au lieu de paramètres probablementJ'ai fait un assistant appelé
nav_link
:utilisé comme:
qui produira du HTML comme
la source
Utilisez l'
current_page?
assistant pour déterminer si vous devez ou non attribuer la"current"
classe. Par exemple:Notez que vous pouvez également passer un chemin (non seulement un hachage d'options), par exemple:
current_page?(root_path)
.la source
J'utilise cette fonction nav_link (texte, lien) dans application_helper.rb (Rails 3) pour faire le travail et il roule mes liens de barre de navigation bootstrap twitter 2.0 pour moi.
Exemple:
la source
current_page?
méthode, comme dans d'autres réponses.La façon dont je l'ai fait est d'ajouter une fonction d'assistance dans l'application_helper
Puis dans la navigation,
Cela teste le chemin du lien par rapport à l'URI de la page actuelle et renvoie votre classe actuelle ou une chaîne vide.
Je n'ai pas testé cela à fond et je suis très nouveau sur RoR (en passant après une décennie avec PHP), donc si cela a un défaut majeur, j'aimerais l'entendre.
Au moins de cette façon, vous n'avez besoin que d'une fonction d'assistance et d'un simple appel dans chaque lien.
la source
Pour construire sur la réponse de @Skilldrick ...
Si vous ajoutez ce code à application.js, cela garantira que tous les menus déroulants avec des enfants actifs seront également marqués comme actifs ...
Pour récapituler le code de support> Ajoutez un assistant appelé nav_link:
utilisé comme:
qui produira du HTML comme
la source
Je pense que le meilleur moyen est
application_helper.rb:
Et au menu:
la source
<%= content_tag(:li, "Click me", class: is_active('controller', 'action')) %>
, il n'imprimera pas un attribut de classe pour nil. apidock.com/rails/ActionView/Helpers/TagHelper/content_tagJe sais que c'est une réponse obsolète, mais vous pouvez facilement ignorer toutes ces vérifications de page en cours en utilisant un wrapper link_to helper, appelé active_link_to gem, cela fonctionne exactement ce que vous voulez, ajoutez une classe active au lien de la page actuelle
la source
Voici l'exemple complet, sur la façon d'ajouter une classe active sur la page de menu bootstrap en mode rails.
la source
J'utilise un joyau génial appelé Tabs on Rails .
la source
J'ai une version plus succincte de nav_link qui fonctionne exactement comme link_to, mais qui est personnalisée pour générer une balise li enveloppante.
Mettez ce qui suit dans votre application_helper.rb
Si vous regardez le code ci-dessus et que vous le comparez au code link_to dans url_helper.rb, la seule différence est qu'il vérifie si l'url est la page courante et ajoute la classe "active" à une balise li d'encapsulation. C'est parce que j'utilise l'assistant nav_link avec le composant nav de Twitter Bootstrap qui préfère que les liens soient enveloppés dans des balises li et que la classe "active" soit appliquée au li externe.
La bonne chose à propos du code ci-dessus est qu'il vous permet de passer un bloc dans la fonction, comme vous pouvez le faire avec link_to.
Par exemple, une liste de navigation bootstrap avec des icônes ressemblerait à ceci:
Svelte:
Production:
De plus, tout comme l'assistant link_to, vous pouvez passer des options HTML dans nav_link, qui seront appliquées à la balise a.
Un exemple de passage d'un titre pour l'ancre:
Svelte:
Production:
la source
Pour moi personnellement, j'ai utilisé une combinaison de réponses ici
J'utilise materialize css et ma façon de rendre les principales catégories réductibles consiste à utiliser le code ci-dessous
j'espère que ça aide quelqu'un
la source
La
current_page?
méthode n'est pas assez flexible pour moi (disons que vous définissez un contrôleur mais pas une action, alors elle ne retournera true que sur l'action d'index du contrôleur), donc j'ai fait cela en fonction des autres réponses:Exemple:
la source
Oui! Consultez cet article: Une meilleure façon d'ajouter une classe `` sélectionnée '' aux liens dans les rails
Déposez nav_link_helper.rb dans app / helpers et cela peut être aussi simple que:
L'assistant nav_link fonctionne exactement comme l'assistant link_to standard de Rails, mais ajoute une classe "sélectionnée" à votre lien (ou à son wrapper) si certains critères sont remplis. Par défaut, si l'url de destination du lien est la même que l'url de la page en cours, une classe par défaut «selected» est ajoutée au lien.
Il y a l'essentiel ici: https://gist.github.com/3279194
MISE À JOUR: Ceci est maintenant un joyau: http://rubygems.org/gems/nav_link_to
la source
J'utilise une aide simple comme celle-ci pour les liens de niveau supérieur afin que la
/stories/my-story
page met en évidence le/stories
lienla source
Laissez-moi vous montrer ma solution:
_header.html.erb :
application_helper.rb :
application_controller.rb :
la source
Selon la réponse de Skilldrick , je vais le changer comme suit:
pour le rendre beaucoup plus utile.
la source
Cette version est basée sur celle de @ Skilldrick mais vous permet d'ajouter du contenu html.
Ainsi, vous pouvez faire:
nav_link "A Page", a_page_path
mais aussi:
ou tout autre contenu html (vous pouvez ajouter une icône par exemple).
Ici, l'assistant est:
la source
Je pense que j'ai trouvé une solution simple qui pourrait être utile dans de nombreux cas d'utilisation. Cela me permet:
link_to
(par exemple, ajoutez une icône à l'intérieur du lien)application_helper.rb
active
au nom de classe entier de l'élément de lien au lieu qu'il s'agisse de la seule classe.Alors, ajoutez ceci à
application_helper.rb
:Et sur votre modèle, vous pouvez avoir quelque chose comme ceci:
En bonus, vous pouvez spécifier ou non un
class_name
et l'utiliser comme ceci:<div class="<%= current_page?(root_path) %>">
Merci aux réponses précédentes 1 , 2 et aux ressources .
la source
tout cela fonctionne avec de simples barres de navigation, mais qu'en est-il du sous-menu déroulant? quand un sous-menu est sélectionné, l'élément du menu supérieur doit être rendu `` courant '' dans ce cas tabs_on_rails me soit la solution
la source
C'est ainsi que j'ai résolu mon projet actuel.
Ensuite..
la source
Ma manière facile -
application.html.erb
,main_controller.erb
,Merci.
la source
Si vous souhaitez également prendre en charge le hachage des options html dans la vue. Par exemple, si vous voulez l'appeler avec une autre classe CSS ou un identifiant, vous pouvez définir la fonction d'assistance comme ceci.
Donc, dans la vue, appelez cet assistant de la même manière que vous appelleriez link_to helper
la source
Créez une méthode
ApplicationHelper
comme ci-dessous.Maintenant, utilisez-le dans la vue comme ci-dessous les cas d'utilisation.
1. Pour toute action d'un contrôleur spécifique
2. Pour toutes les actions de nombreux contrôleurs (séparés par des virgules)
3. Pour une action spécifique de tout contrôleur spécifique
4. Pour l'action spécifique de nombreux contrôleurs (séparés par des virgules)
5. Pour certaines actions spécifiques de tout contrôleur spécifique
6. Pour certaines actions spécifiques de nombreux contrôleurs (séparés par une virgule)
J'espère que ça aide
la source