2009-02-17 6 views
2

Existe-t-il une méthode d'aide (autre que default rails breadcrumb) qui génère dynamiquement une navigation de miettes de pain pour une page particulière sans devoir passer des paramètres triviaux dans l'application RESTful? C'est-à-dire, quelque chose qui détermine automatiquement où l'utilisateur est basé sur l'URL REST qu'elle visite?Fil d'Ariane facile pour l'application RESTful rails

Pour la mise en œuvre mentionnée ci-dessus, nous avons besoin de passer des paramètres comme

RESTE

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

Current page

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

Il doit y avoir un moyen de généraliser le code afin qu'aucun paramètre de passage n'est requis et devrait fonctionner pour toutes les applications RESTful avec configuration minimale.

Répondre

4

Développer un simple hack. La méthode suppose cependant qu'il existe une méthode 'nom' pour chaque objet modèle correspondant à chaque ressource dans l'URL RESTful. Quel que soit le retour de la méthode 'nom', le nom de fil d'Ariane est affiché. S'il n'est pas trouvé, il est montré tel quel sans lien avec quoi que ce soit. Le séparateur utilisé est '->' Vous pouvez le changer en fonction de vos besoins.

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 

La méthode accepte généralement request.url (qui donne l'URL de la page en cours) comme paramètre. La méthode accepte volontairement l'url à des fins de personnalisation. Pour générer le fil d'Ariane, il suffit d'ajouter le code suivant dans votre vue -

<%= get_bread_crumb(request.url) %>

Pour l'url /ideabox/2/idea/1, la mie de pain ressemble

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

Excusez-moi, si la qualité du code est pas terrible . Je suis sûr que ce code peut être recréé mais je suis sûr que vous seriez capable de le faire avant de l'utiliser.

Merci.

0

La solution fournie par chirantan est géniale. Si vous avez besoin de breabcrumbs pour le contrôleur avec espace de noms et que vous avez besoin de changer le fil d'Ariane en fonction de l'espace de noms, essayez ceci. Ce n'est pas parfait mais refactoriser comme vous avez besoin. Cela fonctionne pour mon projet.

Définir une nouvelle aide: 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 

ensuite définir une vue pour cette aide _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] 
Questions connexes