Pour le code suivant:
<%= link_to "Some Page", some_path %>
Comment appliquer une classe css current
à l'aide de la méthode d'assistance current_page?
?
Ou si un autre meilleur moyen est disponible?
Dans app/helpers/application_helper.rb
def cp(path)
"current" if current_page?(path)
end
Dans vos vues:
<%= link_to "All Posts", posts_path, class: cp(posts_path) %>
Fondamentalement, écrivez un simple emballage autour de lui. En outre, vous pouvez étendre la méthode pour autoriser l’application de classes supplémentaires en ajoutant des arguments. Garde les vues concises/sèches. Ou, sans étendre la méthode, vous pouvez simplement effectuer une interpolation de chaîne simple, comme pour ajouter des classes supplémentaires:
<%= link_to "All Posts", posts_path, class: "#{cp(posts_path)} additional_class" %>
Dans mon cas, j'ai beaucoup de contrôleurs avec un nom d'espacement, c'est pourquoi j'aime montrer si la vue actuelle est également dans le chemin du menu. J'avais utilisé la solution de Michael van Rooijen, puis je l'ai personnalisée pour mon cas.
def cp(path)
"current" if request.url.include?(path)
end
<%= link_to "All Posts", posts_path, class: cp(posts_path) %>
Maintenant, si ma barre de menu est/users et que ma page actuelle est/users/10/post, le lien/users est défini avec la classe "current"
Je me suis écarté de la réponse de Michael et ai modifié l'assistant:
def active_class?(*paths)
active = false
paths.each { |path| active ||= current_page?(path) }
active ? 'active' : nil
end
Voici comment vous l'utiliseriez:
<%= link_to "Bookings", bookings_path, class: active_class?(bookings_path) %>
Vous pouvez lui passer plusieurs chemins au cas où vous auriez un onglet pouvant être rendu par plusieurs vues:
<%= content_tag :li, class: active_class?(bookings_path, action: 'new') %>
Et l’avantage de cela, c’est que si les conditions sont false
, le résultat sera inséré nil
. Pourquoi est-ce bon? Eh bien, si vous fournissez class
avec nil
, cela n'inclura pas l'attribut de classe sur la balise. Prime!
Dans l’intérêt de ne pas trop vous répéter en vérifiant tout le temps current_page dans la méthode link_to
, voici une aide personnalisée que vous pouvez utiliser (mettez ceci dans app/views/helpers/application_helpers.rb
def link_to_active_class(name, active_class_names, options = {}, html_options = {}, &block)
html_options[:class] = html_options[:class].to_s + active_class_names if current_page?(options.to_s)
link_to name, options, html_options, &block
end
Exemple d'utilisation:
<div> <%= link_to_active_class('Dashboard', 'bright_blue', dashboard_path, class: 'link_decor') </div>
si vous êtes sur http://example.com/dashboard
, alors il devrait retourner:
<div> <a href='/dashboard' class='link_decor bright_blue'>Dashboard</a> </div>
Cordialement.
Je le ferais de cette façon:
<%= link_to "Some Page", some_path, :class => current_page? ? "current" : "" %>
J'ai essayé de combiner quelques-unes des techniques mentionnées avec mes propres besoins.
def current_page(path)
'current' if current_page?(path)
end
def create_nav_link(string, path, method)
link_to string, path, data: { hover: string }, method: method
end
def create_nav_item(string, path, method = nil)
content_tag :li, create_nav_link(string, path, method), class: current_page(path)
end
En gros, cela vous permet de l’utiliser comme ceci: create_nav_item("profile", profile_path)
, ce qui donnera: <li><a href="/profile" data-hover="Profile">Profile</a></li>
,
ou <li class="current"><a href="/profile" data-hover="Profile">Profile</a></li>
s'il s'agit de la page en cours.
Je n'ai pas utilisé request.url.include?(path)
, car le bouton "Accueil" sera toujours mis en surbrillance et je ne pouvais pas penser à une solution de loin.
Je pense que si ce serait une bonne idée de générer un link_to
complet à partir de votre méthode d'assistance Pourquoi répéter le même code (principe :-) DRY)
def create_link(text, path)
class_name = current_page?(path) ? 'current' : 'any_other_class'
link_to text, path, class: class_name
end
Maintenant, vous pouvez utiliser comme:
<%= create_link 'xyz', any_path %>
(dans les vues) qui rendrait comme <a href="/any" class="current">xyz</a>
J'espère que ça aide!
Une variante de la solution Eric Boehs (la plus robuste à mon humble avis), si vous liez directement à un objet de la classe (c’est-à-dire que vous ne montrez pas l’index), avec un assistant d’application ajouté:
def booking_link
Booking.find(8)
end
Vous pouvez utiliser les éléments suivants dans la vue (le dd est utilisé dans le contexte de zurb foundation)
<%= content_tag :dd, link_to(t('hints.book'), booking_link), class: active_class?(booking_path) %>-