如何在 rails 4 中构建面包屑

How build a breadcrumbs in rails 4

说真的,我不知道从哪里开始。如何在不使用 gems 的情况下实现辅助面包屑? 我尝试了一些宝石,但我更喜欢做一个简单的帮助。存在某人或一些教程?我没有找到这个 =/

谢谢!

你不能这样做。

在你的application_helper中:

def breadcrumb(&block)
    content_tag :ol, { :class => "breadcrumb", :itemprop => "breadcrumb" } do
      block.call
    end
end

def breadcrumb_item(name = nil, url = nil, html_options = {}, &block)
    if name or block
      html_options[:class] = "#{html_options[:class]} active" unless url
      content_tag :li, html_options do
        if block
          block.call name, url
        else
          url ? link_to(name, url) : name
        end
      end
    end
  end

现在在视图中粘贴此代码:(我使用了 index_path 和 @user.name)- 您可以将此代码粘贴到显示视图中作为示例

<%= breadcrumb do %>
  <%= breadcrumb_item "index", index_path %>
  <%= breadcrumb_item @user.name %>
<% end %>

现在当你需要一些面包屑时,你可以调用上面的这个 trunck 并更改路径和实例变量@your_variable

我的解决方案:

navigation_helper.rb

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 => 'navigation', :locals => { :nav => ensure_navigation }
  end
end

_navigation.html.erb

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

application.html.erb

<%= render_navigation %>

以及任意视图:

<% content_for :title, 'My Page Title' %>
    <% navigation_add @something.anything, '#' %>

我进一步研究了 Elton Santos 的解决方案,并决定面包屑应该像历史一样自动生成。所以我修改了一些代码:

在我的 application.html.erb

<%= render_navigation %>

在我看来,我已经在使用:

<% content_for :heading do 'User Detail' end %>

所以,我的 navigation_helper.rb 看起来像:

module NavigationHelper
  def navigation_add(title, url)
    nav_list = session['navigation'].present? ? session['navigation'] : []
    nav_list << { 'title' => title, 'url' => url }
    # 1. Take last 3 items only (-1 is last, not -0)
    nav_list = nav_list[-3..-1] if nav_list.length > 3
    # 2. Now, if first is pointing root, remove it
    nav_list.shift if nav_list[0]['url'] == '/'
    # 3. If last one is same as its predecessor, remove it
    nav_list.pop if nav_list.length > 1 && (nav_list[-1]['url'] == nav_list[-2]['url'])

    session['navigation'] = nav_list
  end

  def render_navigation
    render partial: 'shared/navigation', locals: { nav_list: session['navigation'] }
  end
end

最后,_navigation.html.erb:

<ol class="breadcrumb">
  <li><%= link_to '/' do %>
      <i class="fa fa-home"></i> Home <% end %>
  </li>
  <i class="fa fa-angle-double-right" style="color: #ccc; padding: 0 5px;"></i>

  <% nav_list.each_with_index do |nav, i| %>
    <% if i != nav_list.length-1 %>
      <li><%= link_to nav['title'], nav['url'] %></li>
    <% else %>
      <li class="active"><%= nav['title'] %></li>
    <% end %>
  <% end %>
</ol>

所以,这里发生的是;我将每个页面标题保存在 session 中并从中构建面包屑。我只保留最近的三个条目以及 hard-coded 一个用于主页,并在它们不分开时删除重复的条目。