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

时间:2009-02-17 06:04:32

标签: ruby-on-rails rest breadcrumbs

是否有任何辅助方法(除了default rails breadcrumb之外)为特定页面动态生成面包屑导航而无需在RESTful应用程序中传递普通参数?也就是说,在用户基于她正在访问的REST URL的位置自动计算出来的东西?

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

这样的参数

REST

<% add_crumb(‘Profile’, user_profile_path) %>

当前页面

<% add_crumb(“My Incoming Messages”, request.path) %>

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

2 个答案:

答案 0 :(得分:4)

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

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

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

<%= get_bread_crumb(request.url) %>

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

alt text http://www.imagechicken.com/uploads/1234855404069992300.png

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

感谢。

答案 1 :(得分:0)

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]