2009-02-17 73 views
2

是否有任何幫助程序方法(非default rails breadcrumb)可以爲特定頁面動態生成麪包屑導航,而無需在RESTful應用程序中傳遞微不足道的參數?也就是說,自動計算出用戶基於她正在訪問的REST網址的內容?適用於RESTful Rails應用程序的簡單面包屑程序

對於上面提到的實施,我們需要傳遞的參數,如

REST

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

當前頁

<% add_crumb(「My Incoming Messages」, request.path) %> 

必須有推廣代碼,以便方式沒有參數傳遞是必需的,並且適用於所有RESTful應用程序最小的配置。

回答

4

開發了一個簡單的黑客攻擊。然而,該方法假定對於與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。要生成麪包屑,只需在您的視圖中添加以下代碼 -

<%= get_bread_crumb(request.url) %>

的URL /ideabox/2/idea/1,麪包屑看起來像

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

原諒我,如果代碼質量是不是很大。我相信這個代碼可以重新考慮,但我也確信你可以在使用它之前做到這一點。

謝謝。

0

chirantan提供的解決方案非常棒。如果您需要命名空間控制器的breabcrumbs,並且需要根據命名空間更改麪包屑,請嘗試此操作。這並不完美,但可以根據需要重構它。它適用於我的項目。

定義一個新的幫手:navigation_helper.rb

module NavigationHelper 

    def navigation_add(title, url, namespace) 

    if defined? @@namespace and [email protected]@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] 
相關問題