适用于RESTful rails应用程序的简易面包屑

是否有任何辅助方法(除了默认的rails breadcrumb )为特定页面动态生成面包屑导航,而不必在RESTful应用程序中传递简单的参数? 也就是说,哪些东西可以自动计算用户基于她正在访问的RESTurl的位置?

对于上面提到的实现,我们需要传递像

rest

 

当前页面

  

必须有一种方法来概括代码,以便不需要参数传递,并且应该以最少的配置适用于所有RESTful应用程序。

开发了一个简单的黑客。 然而,该方法假设对于与RESTful URL中的每个资源相对应的每个模型对象存在方法“名称”。 无论方法’name’返回什么,都显示为breadcrumb name。 如果找不到它,它会显示为没有链接到任何东西。 使用的分隔符是’ – >’您可以根据您的要求进行更改。

 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 += "" + eval("#{elements[i - 1].singularize.camelize}.find(#{elements[i]}).name").to_s + '' rescue breadcrumb += elements[i] end else breadcrumb += "#{elements[i].pluralize}" end breadcrumb += ' -> ' if i != elements.size - 1 end breadcrumb rescue 'Not available' end end 

该方法通常接受request.url(其给出当前页面的url)作为参数。 该方法有目的地接受该URL用于定制目的。 要生成面包屑,只需在视图中添加以下代码 –

<%= get_bread_crumb(request.url) %>

对于url /ideabox/2/idea/1 ,面包屑看起来像

替代文字http://www.imagechicken.com/uploads/1234855404069992300.png

如果代码质量不是很好,请原谅。 我确信这段代码可以重新考虑,但我也相信你能够在使用它之前做到这一点。

谢谢。

由chirantan提供的解决方案很棒。 如果你需要breabcrumbs用于命名空间控制器,并且需要根据命名空间更改面包屑,那么试试这个。 这并不完美,但可以根据需要进行重构。 它适用于我的项目。

定义一个新的帮助器: navigation_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 

然后为此帮助程序_navigation.haml定义一个视图

 - 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]