2009-10-17 8 views
1

J'ai une méthode d'aide qui crée des liens de navigation pour certains contrôleurs.Comment rendre cette méthode ruby ​​moins moche (imbrication)

def gen_associations(controllers) 
    content_for :leftnav do 
     sorted_controllers = controllers.sort 
     returning String.new do |content| 
     content << content_tag(:h3, "Associations") << 
     content_tag(:ul, :class => "nav") do 
      sorted_controllers.collect do |c| 
      content_tag("li", :class => ("last" if c == sorted_controllers.last)) do 
       link_to(c.humanize, eval("admin_#{c}_url")) 
      end 
      end 
     end 
     end 
    end 
    end 

Je n'aime pas cette structure imbriquée profondément, et la << supplémentaire et la fin de l'une des lignes.

Comment puis-je le réécrire afin qu'il ne soit pas imbriqué comme ça (en moins de lignes) et sans longues lignes (< 80 caractères)?

Répondre

2

construire à partir de l'intérieur vers l'extérieur:

def gen_associations(controllers) 
    sorted_controllers = controllers.sort 

    list_items = 
     sorted_controllers.collect do |c| 
     content_tag("li", :class => ("last" if c == sorted_controllers.last)) do 
      link_to(c.humanize, eval("admin_#{c}_url")) 
     end 
     end 

    list = content_tag(:ul, list_items.join, :class => "nav") 

    content_for :leftnav do 
     content_tag(:h3, "Associations") << list 
    end 
    end 

Je probablement déplacer le content_for à la vue ou partielle et juste gen_associations() retourner le list.

... 
<% content_for :leftnav do %> 
    <h3>Associations</h3> 
    <%= gen_associations(@controllers) %> 
<% end %> 
... 
7

utilisation partielle - mettre tout en fermeture de retourner là-bas et puis utilisez render :partial => ...

3

Pensez à utiliser quelque chose comme markaby au lieu de content_tag; cela rend vos assistants beaucoup plus lisibles. Voir aussi: railscast.