2013-09-05 27 views
11

Fondamentalmente, ho un sacco di codice che assomiglia a questo:Aggiungi una classe 'attiva' a tutti i link attivi nei binari?

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

che non è molto DRY.

Mi chiedevo se qualcuno conosce un buon modo per modificare il link_per helper stesso per aggiungere automaticamente una classe 'attiva' a tutti i collegamenti alla pagina corrente.

Se è utile, sono aperto all'utilizzo di HAML o SLIM.

risposta

7

Questo è un buon caso per scrivere il proprio helper che avvolge il link_to. Nel tuo application_helper.rb puoi scrivere un metodo active_link_to che prende gli stessi parametri di link_to + current_page, e quindi chiama semplicemente link_to come fai sopra.

1

Ecco l'aiutante che uso. Aggiungo un parametro opzionale "match_text" per una maggiore flessibilità (per esempio, se voglio segnare un collegamento come attivo quando il percorso della richiesta reale è una pagina figlio della destinazione del collegamento.)

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

È un problema risolto, basta usare la gemma active_link_to. Il vostro esempio si semplifica in questo:

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

active_link_to è impressionante. Ti consente di racchiudere i collegamenti (ad esempio con 'li') e specificare altre condizioni di corrispondenza, come con espressioni regolari. Grazie! – manafire

11

ho scritto metodo di supporto semplice utilizzando costruire in view helper current_page? quando è possibile specificare personalizzato class nome nel html_options hash.

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 

esempi (quando si è in root_path rotta):

<%= 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

Si interrompe quando si passa effettivamente un blocco a 'active_link_to' a causa di come funziona' link_to'. – maxhungry

+0

questo è davvero intelligente. Grazie. – cyonder

3

ho affrontato stessa esigenza e qui è la mia soluzione.

Creare un metodo all'interno ApplicationHelper

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

E dentro la visualizzazione:

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

Questa è la soluzione più pulita, semplice e più semplice per rispondere agli OP. A mio avviso, non è necessario inserire una gemma per un helper per le applicazioni. – toughskin