Почему мой рекурсивный метод из хелпера не возвращает каждое значение? - PullRequest
6 голосов
/ 20 мая 2011

Я хочу отобразить дерево категорий, управляемых наследством драгоценных камней.

Я хотел бы использовать помощника, который будет рекурсивно проходить по дереву и возвращать категории по очереди, на данный момент без 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

Аргумент category является одной из корневых категорий.

Что он должен вернуть?

  • На веб-странице: Отображает только категорию корневого уровня Sport Beauty Automobile
  • В консоли: Men Indoor Women Children Water sport Garage

Если получить их, то это означает, что рекурсия работает, но это не так. Почему он возвращает только первую итерацию?

Также хотелось бы получить их в следующем порядке:

root/child/child-of-child

но если я хочу вернуть category.name, он должен быть в последней позиции.

Не могли бы вы дать мне свои комментарии?

PS: Я только что обнаружил (при добавлении тегов), что я использовал слово «рекурсивность» на протяжении всего поиска, но его не существует, даже если многие люди используют его в stackOveflow; о) -> "рекурсия", но все же я застрял

** РЕДАКТИРОВАТЬ **

Теперь я использую этот код:

            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

, что дает мне:

        <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>

Но этот html не интерпретируется, и тот же код отображается на отображаемой веб-странице. Я имею в виду, что я вижу

Я, наверное, что-то упустил ... может быть, знание oO

Thx

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Используемый вами метод вернет только одно значение (на самом деле первый вызов category.name) Что касается консоли, вы получаете путы, которые у вас есть внутри цикла (это не возвращаемое значение метода).

Попробуйте и дайте мне знать, если что-то еще недостаточно ясно:

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 голосов
/ 25 мая 2011
        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

Я отвечаю на мой последний вопрос редактирования.Мне пришлось добавить эту строку:

tree.html_safe

, чтобы интерпретировать строку.

Thx

...