2011-05-20 3 views
6

Desidero visualizzare un albero di categorie gestite con la discendenza della gemma.Perché il mio metodo ricorsivo da helper non restituisce ogni valore?

Vorrei utilizzare un helper che ricorsivamente passerà attraverso l'albero e restituirà le categorie una per una, per il momento senza tag o contenuti html.

module CategoriesHelper 
    def display_tree(category) 
    if category.has_children? 
     category.children.each do |sub_category| 
     display_tree(sub_category) 
     puts(sub_category.name) # to check if it goes here 
     end 
    end 
    category.name 
    end 
end 

L'argomento category è una delle categorie di root.

Cosa deve restituire?

  • Nella pagina web: Esso mostra solo la categoria livello principale Sport Beauty Automobile
  • Nella console: Men Indoor Women Children Water sport Garage

Se li ottenere, allora vuol dire che le opere ricorsione, ma non lo fa . Perché restituisce solo la prima iterazione?

Inoltre vorrei farli nel seguente ordine:

root/child/child-of-child 

ma se voglio tornare category.name, dovrebbe essere in ultima posizione.

Potrebbe per favore darmi i vostri commenti?

PS: Ho appena scoperto (durante l'aggiunta di tag) che stavo usando la parola "ricorsività" per tutto il tempo le mie ricerche, ma non esiste, anche se molte persone lo usano sul stackOveflow; o) - > "ricorsione", ma comunque mi sono bloccato

** EDIT **

ora uso di questo codice:

  module CategoriesHelper 

       def display_tree(category) 
       tree = "<div class =\"nested_category\">#{category.name}" 
       if category.has_children? 
        category.children.each do |sub_category| 
        tree += "#{display_tree(sub_category)}" 
        end 
       end 
       tree += "</div>" 
       end 
      end 

che mi dà:

012.
 <div class ="nested_category">Sport 
      <div class ="nested_category">Men</div> 
      <div class ="nested_category">Women 
       <div class ="nested_category">Indoor</div> 
      </div> 
      <div class ="nested_category">Children</div> 
      <div class ="nested_category">Water sport</div> 
     </div> 
     <div class ="nested_category">Beauty</div> 
     <div class ="nested_category">Automobile 
      <div class ="nested_category">Garage</div> 
     </div> 

Ma quell'html non viene interpretato e lo stesso codice viene mostrato nella pagina web visualizzata. Voglio dire che vedo

probabilmente ho perso qualcosa ... forse la conoscenza oO

Thx

+0

Aggiungi il codice di vista che stai utilizzando per eseguire il rendering sul modello. Probabilmente ti manca il metodo raw() che racchiude il metodo display_tree() per evitare che Rails> = 3 scape automaticamente l'html. – robertodecurnex

risposta

3

Il mothod si utilizza restituirà un solo valore (la chiamata pugno per category.name in realtà) Chi la console, stai ricevendo le put che hai all'interno del ciclo (che non è il valore di ritorno del metodo).

Prova questo e fammi sapere se c'è ancora qualcosa non è abbastanza chiaro:

module CategoriesHelper 

    def display_tree(category) 
    tree = category.name 
    if category.has_children? 
     category.children.each do |sub_category| 
     tree += "/#{display_tree(sub_category)}" 
     end 
    end 
    tree 
    end 

end 
+0

Probabilmente avrai bisogno di un formato più specifico. Se è possibile fornire informazioni più dettagliate sul valore di ritorno atteso, possiamo migliorare l'esempio. – robertodecurnex

+0

Questo è giusto; le put delle invocazioni annidate non sono direttamente aggiunte al buffer di output della root. Questo è un modo abbastanza intelligente per gestirlo credo. – Jeremy

+0

Grazie :) quello era il mio fraintendimento !! – Bachet

0
 module CategoriesHelper 

      def display_tree(category) 
      tree = "<div class =\"nested_category\">#{category.name}" 
      if category.has_children? 
       category.children.each do |sub_category| 
       tree += "#{display_tree(sub_category)}" 
       end 
      end 
      tree += "</div>" 
      tree.html_safe #That was missing to interprete the html returned... 
      end 
     end 

rispondo per la mia ultima modifica domanda.Ho dovuto aggiungere questa riga:

tree.html_safe 

per interpretare la stringa.

Thx

Problemi correlati