У меня есть веб-приложение с деревом категорий, которое опубликовано на домашней странице с примерно 1200 категориями. Это дерево категорий строится с использованием act_as_tree (parent_id и т. Д.), Которое создает дерево в формате html с использованием <ul>
и <li>
.
Если я опубликую дерево сразу, оно работает отлично, но на самом деле довольно медленно (~ 4 секунды загрузки), что, очевидно, не подходит для домашней страницы.
Хорошо, что это дерево категорий редко изменяется, поэтому его можно построить при запуске сервера. Таким образом, я создал инициализатор category_tree.rb и поместил его в папку инициализаторов.
Я создал глобальную переменную $ category_tree и "вставил html" туда вроде этого (это упрощенный пример):
def create_tree(categories)
ret = '<ul>'
categories.each do |cat|
ret = "<li><a href='" + cat.url + "'>" + cat.name + "</a>"
end
ret = '</ul>'
end
$category_tree = create_tree(Category.all)
и затем в моем индексном представлении я просто положил:
<%= $category_tree %>
Это все работает! Он загружается быстро и правильно. Но у меня есть некоторые проблемы, с которыми мне нужна помощь:
Использование <a href>
не будет очень стабильным в долгосрочной перспективе. Я бы предпочел использовать link_to и paths, но проблема в том, что мой инициализатор загружается до маршрутов. Это делает невозможным вызов category_path, например. Как я могу решить это? Как я могу сделать так, чтобы файл category_tree.rb загружался ПОСЛЕ того, как загружается rout.rb?
Я не знаю, очень ли разумно использовать такую глобальную переменную. Я предполагаю, что он будет постоянно хранить в памяти мое дерево категорий html, что, я полагаю, не слишком умно. Это правильно?
Я бы предпочел, чтобы при запуске я создавал партиал, содержащий мое дерево категорий html, в котором я могу использовать маршруты / пути. Решение, которое не нужно будет хранить в памяти. Как я могу решить это?