Добавить "активный" класс для всех активных ссылок в рельсах?

В принципе, у меня много кода, который выглядит так:

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

который не очень суровый.

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

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

Ответ 1

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

Ответ 2

Это решаемая проблема, просто используйте active_link_to gem. Ваш пример упрощает это:

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

Ответ 3

Я написал простой хелпер-метод, используя build in view helper 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>

Ответ 4

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

Создайте метод в ApplicationHelper

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

И внутри вашего представления:

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

Ответ 5

Вот помощник, который я использую. Я добавляю необязательный параметр "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

Ответ 6

Используйте link_to_unless_current, а затем дайте ему вид активной ссылки в CSS.