2013-09-05 11 views
11

Grundsätzlich habe ich eine Menge Code, der wie folgt aussieht:Fügen Sie allen aktiven Verbindungen in Schienen eine 'aktive' Klasse hinzu?

link_to t('.profile'), business_path(@business), class: '#{'active' if current_page? business_path(@business)}' 

, die nicht sehr trocken ist.

Ich frage mich, ob jemand eine gute Möglichkeit, den Link_to Helper selbst zu ändern, um automatisch eine 'aktive' Klasse zu allen Links auf der aktuellen Seite hinzuzufügen.

Wenn es hilft, bin ich offen für die Verwendung von HAML oder SLIM.

Antwort

7

Dies ist ein guter Fall für das Schreiben Ihres eigenen Helfers, der die link_to umschließt. In Ihrer application_helper.rb können Sie eine Methode schreiben active_link_to, die die gleichen Parameter wie link_to + current_page, und dann ruft nur link_to wie Sie oben tun.

1

Hier ist der Helfer, den ich benutze. Ich füge einen optionalen „match_text“ Parameter für zusätzliche Flexibilität (zum Beispiel, wenn ich einen Link als aktiv markieren möge, wenn der tatsächliche Anforderungspfad ein Kind Seite des die Ziels der Verbindung ist.)

def link_to_active(text, destination, options = {}) 
    match_text = options.delete(:match_text) 

    classes = options[:class].present? ? options[:class].split(" ") : [] 
    classes << "active" if request.fullpath.downcase == destination.downcase || (match_text && request.fullpath.downcase.include?(match_text.downcase)) 

    options = options.except(:class) 
    options.merge!(:class => classes.join(" ")) unless classes.empty? 

    link_to(text, destination, options) 
end 
11

Es ist ein gelöstes Problem, verwenden Sie einfach active_link_to gem. Ihr Beispiel vereinfacht so aus:

= active_link_to t('.profile'), business_path(@business) 
+1

active_link_to genial. Sie können Links (z. B. mit "li") umbrechen und andere übereinstimmende Bedingungen angeben, z. B. mit Regex. Vielen Dank! – manafire

11

Ich schrieb einfache Hilfsmethode in View Helfer verwenden bauen current_page?, wenn Sie benutzerdefinierte class Namen in html_options Hash angeben.

def active_link_to(name = nil, options = nil, html_options = nil, &block) 
    active_class = html_options[:active] || "active" 
    html_options.delete(:active) 
    html_options[:class] = "#{html_options[:class]} #{active_class}" if current_page?(options) 
    link_to(name, options, html_options, &block) 
end 

Beispiele (wenn Sie auf root_path Route sind):

<%= active_link_to "Main", root_path %> 
# <a href="/" class="active">Main</a> 

<%= active_link_to "Main", root_path, class: "bordered" %> 
# <a href="/" class="bordered active">Main</a> 

<%= active_link_to "Main", root_path, class: "bordered", active: "disabled" %> 
# <a href="/" class="bordered disabled">Main</a> 
+2

Dies bricht, wenn Sie einen Block an Ihren 'active_link_to' übergeben, da rails 'link_to' funktioniert. – maxhungry

+0

das ist wirklich schlau. Vielen Dank. – cyonder

3

ich gleiche Anforderung konfrontiert, und hier ist meine Lösung.

Erstellen Sie eine Methode innerhalb ApplicationHelper

def active_class(link_path) 
    current_page?(link_path) ? "active" : "" 
end 

Und in Ihrer Ansicht:

<li class="<%= active_class('/') %>"> 
     <%= link_to 'HOME', root_path %> 
    </li> 
+1

Dies ist die sauberste, einfachste und einfachste Lösung für OPs. Keine Notwendigkeit, ein Juwel für einen Anwendungshelfer meiner Meinung nach einzufügen. – toughskin