如何在 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 一个用于主页,并在它们不分开时删除重复的条目。
说真的,我不知道从哪里开始。如何在不使用 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 一个用于主页,并在它们不分开时删除重复的条目。