Ответ 1
В том же духе, что сказал Чак:
<% TARGETS.each do |target| %>
<li>
<%= link_to target.humanize,
{ :controller => target },
class => ('active' if current_controller == target)) %>
</li>
<% end %>
Прямо сейчас у меня есть частичная навигация, которая выглядит так (кнопки x10)...
<% if current_controller == "territories" %>
<li><%= link_to "Territories", {:controller => 'territories'}, :class => 'active' %></li>
<% else %>
<li><%= link_to "Territories", {:controller => 'territories'} %></li>
<% end %>
<% if current_controller == "contacts" %>
<li><%= link_to "Contacts", {:controller => 'Contacts'}, :class => 'active' %></li>
<% else %>
<li><%= link_to "Contacts", {:controller => 'Contacts'} %></li>
<% end %>
Есть ли более элегантное/DRY-решение для этого?
В том же духе, что сказал Чак:
<% TARGETS.each do |target| %>
<li>
<%= link_to target.humanize,
{ :controller => target },
class => ('active' if current_controller == target)) %>
</li>
<% end %>
Довольно легко увидеть, где находится повторение. Все это общая форма:
<% if current_controller == XXXXX %>
<li><%= link_to XXXXX, {:controller => XXXXX}, CLASS %></li>
<% else %>
[do the same stuff minus ":class => 'active'"]
<% end %>
Итак, мы хотим, чтобы XXXXX и CLASS были переменными (так как это единственные вещи, которые меняются), а остальные могут быть простым шаблоном.
Итак, мы могли бы сделать что-то вроде этого:
%w(Contacts Territories).each |place|
<% class_hash = current_controller == place ? {:class => 'active'} : {}
<li><%= link_to place, {:controller => place}, class_hash)</li>
Отметьте rails-widgets в github. Он предоставляет тонну вспомогательных помощников для элементов UI рельсов (tabnavs, всплывающих подсказок, планшетов, show hide toggle, простой css progressbar) в дополнение к навигации.
Вот docs
Отъезд link_to_unless_current
. Не совсем то, что вы просили, но это близко.
Кроме того, вы могли бы поставить эту логику в помощнике, чтобы отвлечь ее от представления.
Несколько другая версия w/link_to_unless_current:
<ul>
<% links.each do |link| -%>
<li><%= link_to_unless_current link.humanize, { :controller => target } %></li>
<% end -%>
</ul>
Хорошим ресурсом для таких вещей являются рельсы docs.
Проверьте плагин простой навигации. Это "простой в использовании" плагин rails для создания навигационных приложений для ваших рельсовых приложений.