Ruby on rails 用于RESTful rails应用程序的简易面包屑
是否有任何助手方法(除了)可以为特定页面动态生成面包屑导航,而不必在RESTful应用程序中传递琐碎的参数?也就是说,可以根据用户访问的REST url自动计算出用户的位置 对于上述实现,我们需要传递如下参数 休息Ruby on rails 用于RESTful rails应用程序的简易面包屑,ruby-on-rails,rest,breadcrumbs,Ruby On Rails,Rest,Breadcrumbs,是否有任何助手方法(除了)可以为特定页面动态生成面包屑导航,而不必在RESTful应用程序中传递琐碎的参数?也就是说,可以根据用户访问的REST url自动计算出用户的位置 对于上述实现,我们需要传递如下参数 休息 <% add_crumb(‘Profile’, user_profile_path) %> 当前页面 <% add_crumb(“My Incoming Messages”, request.path) %> 必须有一种方法来泛化代码,这样就不需要
<% add_crumb(‘Profile’, user_profile_path) %>
当前页面
<% add_crumb(“My Incoming Messages”, request.path) %>
必须有一种方法来泛化代码,这样就不需要参数传递,并且可以在配置最少的情况下适用于所有RESTful应用程序。开发了一个简单的hack。但是,该方法假设RESTful url中每个资源对应的每个模型对象都存在一个方法“name”。方法“name”返回的任何内容都显示为breadcrumbname。如果找不到,则按原样显示,而不使其链接到任何内容。使用的分隔符为“->”,您可以根据需要更改它
def get_bread_crumb(url)
begin
breadcrumb = ''
sofar = '/'
elements = url.split('/')
for i in 1...elements.size
sofar += elements[i] + '/'
if i%2 == 0
begin
breadcrumb += "<a href='#{sofar}'>" + eval("#{elements[i - 1].singularize.camelize}.find(#{elements[i]}).name").to_s + '</a>'
rescue
breadcrumb += elements[i]
end
else
breadcrumb += "<a href='#{sofar}'>#{elements[i].pluralize}</a>"
end
breadcrumb += ' -> ' if i != elements.size - 1
end
breadcrumb
rescue
'Not available'
end
end
def获取面包屑(url)
开始
面包屑=“”
sofar='/'
elements=url.split(“/”)
对于1…元素中的i.size
sofar+=元素[i]+'/'
如果i%2==0
开始
面包屑+=“'
营救
面包屑+=元素[i]
结束
其他的
面包屑+=“”
结束
面包屑+='->'如果i!=元素。大小-1
结束
面包屑
营救
“不可用”
结束
结束
该方法通常接受request.url(当前页面的给定url)作为参数。该方法出于自定义目的特意接受url。要生成面包屑,只需在视图中添加以下代码-
对于url/ideabox/2/idea/1
,面包屑看起来像
请原谅,如果代码质量不是很好。我相信这段代码可以被重新分解,但我也相信你在使用它之前可以做到这一点
谢谢。chirantan提供的解决方案很棒。如果您需要名称空间控制器的面包屑,并且需要根据名称空间更改面包屑,请尝试此方法。这并不完美,但可以根据需要进行重构。它适用于我的项目 定义新的帮助程序:
navigation\u helper.rb
module NavigationHelper
def navigation_add(title, url, namespace)
if defined? @@namespace and !@@namespace.nil? and @@namespace == namespace
@@navigation ||= []
else
@@navigation = []
end
@@navigation << {title: title, url: url} unless title == "Home"
new_nav = []
@@navigation.each do |hash|
new_nav.push hash
if hash[:title].to_s == title.to_s
break
end
end
@@navigation = new_nav
@@navigation.uniq!
@@namespace = namespace
end
def render_navigation
if (request.path_parameters[:controller].sub('/', '::_').camelize + 'Controller').classify.constantize.action_methods.to_a.include? 'index'
navigation_add controller_name.camelize.to_s, request.path_parameters.merge({action: 'index'}).except(:id), params[:controller].include?('/') ? params[:controller].split("/").first : nil
end
if defined? @@navigation
render partial: 'navigation/navigation', locals: { navs: @@navigation, namespace: @@namespace }
else
render text: ''
end
end
end
- unless navs.blank?
%ol.breadcrumb
- navs.each_with_index do |nav, index|
- if index == 0
%li=link_to fa_icon('arrow-left', text: 'Go Back'), :back
- unless namespace.nil?
%li
%h4.inline= request.fullpath.split('/')[1].gsub('-', '_').camelize
= fa_icon('angle-double-right')
%li= link_to_unless (nav[:title] == controller_name.camelize and action_name == 'index'), fa_icon(nav[:title].downcase.singularize, text: nav[:title]), nav[:url]