如何在Rails 3中创建动态生成的面包屑导航?

12

Breadcrumb是导航元素,用于告诉用户他们在网站上的位置。

例如:

首页 >> 项目 >> 阶段 >> 上传。

其中首页、项目、阶段和上传都是不同的控制器。

2个回答

27

我用了将近10年的时间几乎使用相同的代码... 最初是在ASP中编写的,然后是C#,PHP,现在是Rails:

module NavigationHelper
    def ensure_navigation
        @navigation ||= [ { :title => 'Home', :url => '/' } ]
    end

    def navigation_add(title, url)
        ensure_navigation << { :title => title, :url => url }
    end

    def render_navigation
        render :partial => 'shared/navigation', :locals => { :nav => ensure_navigation }
    end
end

然后,在shared/navigation.html.erb中:

<div class="history-nav">
    <% nav.each do |n| %>
        <%= link_to n[:title], n[:url] %>
    <% end %>
    <%= link_to yield(:title), request.path, :class => 'no-link' %>
</div>

你的常规视图:

<% content_for :title, 'My Page Title' %>
<% navigation_add 'My Parent Page Title', parent_page_path %>

而你的模板:

<html>
<head>
  <title> <%= yield :title %> </title>
</head>
<body>
  ...
  <%= render_navigation %>
  ...
  <%= yield %>
</body>
</html>

顺便问一下,第一个片段应该放在哪里?是要加到我的应用控制器中吗? - marcamillion
2
第一个是新的帮助程序。您可以将其代码添加到任何要使用的帮助程序中,但我喜欢它作为独立的帮助程序,即“NavigationHelper”。 - Fábio Batista
嘿,这看起来很简洁明了。我要试一下。 - Donato
1
好的逻辑不需要依赖于其他宝石,干得好啊。 - Shailendr singh
如果视图可以有两个父级,如何处理? - MrWater
显示剩余3条评论

1

在不使用<% content_for :title, 'My Page Title' %>的情况下,可以更新先前的答案

  <div class="history-nav">
    <% nav.each do |n| %>
      <% unless n.equal? nav.last %>
        <%= link_to n[:title], n[:url] %>            
      <% else %>
        <%= n[:title] %>
      <% end %>
    <% end %>
  </div>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接