是否有更干的方法根据 Rails 中的路由动态添加 class?

Is there a more DRY way to dynamically add a class depending on route in Rails?

我有一个包含以下元素的导航栏:

%li 
  = link_to 'About', 'about'
%li
  = link_to 'Help', 'help'
%li 
  = link_to 'FAQ', 'faq'

当有人访问特定页面时,我想根据访问的页面将 class active 添加到 li。例如,如果他们访问了常见问题解答页面,最终结果将如下所示:

%li 
  = link_to 'About', 'about'
%li
  = link_to 'Help', 'help'
%li.active
  = link_to 'FAQ', 'faq'

这是我目前使用的:

- if request.env['PATH_INFO'] == '/about'
  %li.active
    = link_to 'About', 'about'
- else
  %li
    = link_to 'About', 'about'

- if request.env['PATH_INFO'] == '/help'
  %li.active
    = link_to 'Help', 'help'
- else
  %li
    = link_to 'Help', 'help'

- if request.env['PATH_INFO'] == '/faq'
  %li.active
    = link_to 'FAQ', 'faq'
- else
  %li
    = link_to 'FAQ', 'faq'

有没有一种方法可以减少重复次数?

检查 link_to_unless_current (and the variations of url_helper) 在 API 文档中。

要获得 li.active,可以使用 current_page?。类似于:

%li{class:("active" if current_page?)}
  %= link_to_unless_current "Help", "help"

要始终显示 link,无论是否在当前页面上,只需:

%li{class:("active" if current_page?)}
  %= link_to "Help", "help"

您可以为此使用 https://github.com/comfy/active_link_to gem。它非常简单但可定制。如果匹配到某条路由则添加activeclass(可自定义匹配)

active_link_to 'Users', '/users'
# => <a href="/users" class="active">Users</a>

active_link_to 'Users', users_path, :wrap_tag => :li
# => <li class="active"><a href="/users" class="active">Users</a></li>