2009-03-01 88 views
11

现在我有部分导航看起来像这样(X10按钮)...Rails:处理导航的优雅方式?

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

是否有这样做的更优雅/干的解决方案?

回答

8

与此类似什么查克说:

<% TARGETS.each do |target| %> 
    <li> 
    <%= link_to target.humanize, 
     { :controller => target }, 
     class => ('active' if current_controller == target)) %> 
    </li> 
<% end %> 
+0

什么是TARGETS? – DaMainBoss 2012-03-09 11:44:44

1

结账link_to_unless_current。不完全是你要求的,但它很接近。

此外,你可以把这种逻辑放在帮助器中将它抽象出来。

3

很容易看出重复在哪里。这是所有的一般形式:

<% if current_controller == XXXXX %> 
    <li><%= link_to XXXXX, {:controller => XXXXX}, CLASS %></li> 
<% else %> 
    [do the same stuff minus ":class => 'active'"] 
<% end %> 

因此,我们要XXXXX和类中的变量(因为这些都是改变的唯一的东西),其余的可以是一个简单的模板。

所以,我们可以做这样的事情:

%w(Contacts Territories).each |place| 
    <% class_hash = current_controller == place ? {:class => 'active'} : {} 
    <li><%= link_to place, {:controller => place}, class_hash)</li> 
1

一个稍微不同的版本W/link_to_unless_current:

<ul> 
<% links.each do |link| -%> 
<li><%= link_to_unless_current link.humanize, { :controller => target } %></li> 
<% end -%> 
</ul> 

像这样的东西的好资源是rails文档。

2

在github上查看rails-widgets。除了导航之外,它还为Rails用户界面提供了大量的便利帮助(Tabnavs,工具提示,tableizers,show hide切换,简单的css进度条)。

这里是docs

1

退房的simple-navigation plugin。这是一个易于使用的rails插件,用于为您的rails应用程序创建导航。