2013-09-05 4 views
11

В принципе, у меня есть много кода, который выглядит следующим образом:Добавить «активный» класс для всех активных ссылок в рельсах?

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

, которая не очень DRY.

Мне было интересно, если кто-нибудь знает хороший способ изменить link_to помощник, чтобы автоматически добавить «активный» класс ко всем ссылкам на текущую страницу.

Если это помогает, я открыт для использования HAML или SLIM.

ответ

7

Это хороший случай для написания собственного помощника, который обертывает link_to. В вашем приложении application_helper.rb вы можете написать метод active_link_to, который принимает те же параметры, что и link_to + current_page, а затем просто вызывает link_to, как вы делаете выше.

1

Вот помощник, который я использую. Добавить дополнительный параметр «match_text» для дополнительной гибкости (например, если я хочу, чтобы пометить ссылку как активные, когда фактический путь запроса является дочерней страницей назначения ссылки.)

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

Это решаемая проблема, просто используйте драгоценный камень active_link_to. Ваш пример упрощает это:

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

active_link_to является удивительным. Он позволяет обернуть ссылки (например, с помощью 'li') и указать другие условия сопоставления, например, с помощью регулярного выражения. Благодаря! – manafire

11

Я написал простой вспомогательный метод с использованием встраивать зрения помощника current_page?, когда вы можете указать пользовательские class имя в html_options хэш.

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 

Примеры (когда вы на root_path маршруте):

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

Это происходит, когда вы фактически передаете блок в ваш 'active_link_to' из-за того, как работает rails 'link_to'. – maxhungry

+0

это действительно умный. Благодарю. – cyonder

3

я столкнулся же требование, и вот мое решение.

Создание метода в ApplicationHelper

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

А внутри вашей точки зрения:

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

Это самое простое, простое и простое решение для ответа OPs. На мой взгляд, нет необходимости вставлять драгоценный камень для помощника приложения. – toughskin