使用部分中的活动类重构navbar

时间:2012-12-27 05:55:13

标签: ruby-on-rails ruby-on-rails-3 refactoring

这就是我所拥有的,我希望将其包含在一个部分中,以便我不会在4个地方重复它。问题是活动类应该根据用户所在的页面进行更改。我怎么能这样做?或者我最好只重复4个模板中的代码?

<div class="navbox">
  <ul class="nav">
    <a href="#" class="active"> Account</li></a>
    <a href="#"><li> Profile</li></a>
    <a href="#"><li> Photos</li></a>
    <a href="#"><li> Security</li></a>
  </ul>
</div>

3 个答案:

答案 0 :(得分:3)

渲染时传入active本地:

render :partial => 'navbox', :locals => { :active => 'Account' }

然后将此作为你的部分:

<div class="navbox">
  <ul class="nav">
    <a href="#"<% if active == 'Account' %> class="active"<% end %>> Account</li></a>
    <a href="#"<% if active == 'Profile' %> class="active"<% end %>><li> Profile</li></a>
    <a href="#"<% if active == 'Photos' %> class="active"<% end %>><li> Photos</li></a>
    <a href="#"<% if active == 'Security' %> class="active"<% end %>><li> Security</li></a>
  </ul>
</div>

有各种方法可以清理(link_to,辅助方法等),这是一个练习。如果您可以从请求URL中推断某些内容是“活动的”,您还可以避免需要传入本地。

另请查看link_to_unless_current&amp; link_to_unless如果您根本不想链接,而不是在链接中添加类。

答案 1 :(得分:2)

寻找active_link_to gem https://github.com/twg/active_link_to 这是最简单的方法

答案 2 :(得分:2)

你可以尝试这样克里特的帮手:

{'Account' => account_path, 'Profile' => profile_path...etc}.each do |name, path|
  content_tag :li do
    link_to name, path, class: (current_page?(path) 'active' : 'regular')
  end
end

另请参阅方法link_to_unless_current http://apidock.com/rails/ActionView/Helpers/UrlHelper/link_to_unless_current