2013-09-05 36 views
11

Temelde, şöyle bir sürü kod var.Raylardaki tüm aktif linklere 'aktif' bir sınıf ekleyin mi? çok KURU değil</p> <pre><code>link_to t('.profile'), business_path(@business), class: '#{'active' if current_page? business_path(@business)}' </code></pre> <p>:

Herhangi bir kimse, geçerli sayfaya yapılan tüm bağlantılara otomatik olarak 'etkin' bir sınıf eklemek için link_to yardımcısının kendisini değiştirmenin iyi bir yolunu biliyor mu diye merak ediyordum.

Eğer yardımcı oluyorsa, HAML veya SLIM kullanmaya hazırım.

cevap

7

Bu, link_to'yu saran kendi yardımcınızı yazmak için iyi bir durumdur. Application_helper.rb dosyasında, link_to + current_page ile aynı paramları alan active_link_to metodunu yazabilir ve daha sonra yukarıda yaptığınız gibi link_to'yu çağırabilirsiniz.

1

İşte kullanıyorum yardımcı. (Ben gerçek istek yolu bağlantının hedef bir çocuk sayfası aktif olarak bir bağlantı işaretlemek istiyorsanız, örneğin.) Ben esneklik için isteğe bağlı "match_text" parametre eklemek

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

Bu bir sorun, sadece active_link_to gem kullanın. Sizin örnek Buna kolaylaştırır:

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

active_link_to müthiş. Bağlantıları (ör. Li ile) sarmanıza ve normal ifadelerle benzer diğer koşulları belirtmenize izin verir. Teşekkürler! – manafire

11

Ben özel class adı html_options bitözetini belirtebilirsiniz zaman görünümü yardımcı current_page? inşa kullanarak basit yardımcı yöntemini yazdı.

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 

Örnekler (sen root_path rotada olduğunda):

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

Bu, "active_link_to" bağlantısına gerçekte bir bloğu ilettiğinizde, "link_to" raylarının nasıl çalıştığı nedeniyle bozulur. – maxhungry

+0

bu gerçekten akıllı. Teşekkürler. – cyonder

3

Aynı gereksinimi karşılaştığı ve burada bir çözümdür.

ApplicationHelper

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

içinde Ve görünümü içindeki yöntemi oluşturun:

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

Bu OP'lerin cevabı için en temiz, en basit ve en kolay çözümdür. Bir uygulama yardımcısı için bir cevabın fikrime girmesine gerek yok. – toughskin