【问题标题】:Easy breadcrumbs for RESTful rails applicationRESTful rails 应用程序的简单面包屑
【发布时间】:2009-02-17 06:04:32
【问题描述】:

是否有任何辅助方法(default rails breadcrumb 除外)可以为特定页面动态生成面包屑导航,而无需在 RESTful 应用程序中传递琐碎的参数?也就是说,可以根据用户访问的 REST url 自动确定用户在哪里?

对于上面提到的实现,我们需要传递类似的参数

休息

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

当前页面

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

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

【问题讨论】:

    标签: ruby-on-rails rest breadcrumbs


    【解决方案1】:

    开发了一个简单的 hack。然而,该方法假定与 RESTful url 中的每个资源对应的每个模型对象都存在一个方法“名称”。无论方法“名称”返回什么,都显示为面包屑名称。如果未找到,则按原样显示,而不使其链接到任何内容。使用的分隔符是 '->' 您可以更改它以满足您的要求。

    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 用于自定义目的。要生成面包屑,只需在视图中添加以下代码 -

    &lt;%= get_bread_crumb(request.url) %&gt;

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

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

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

    谢谢。

    【讨论】:

      【解决方案2】:

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

      定义一个新的助手: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]
      

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多