Rails: предварительная загрузка / создание частичного при запуске сервера - PullRequest
1 голос
/ 23 января 2012

У меня есть веб-приложение с деревом категорий, которое опубликовано на домашней странице с примерно 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 %>

Это все работает! Он загружается быстро и правильно. Но у меня есть некоторые проблемы, с которыми мне нужна помощь:

  1. Использование <a href> не будет очень стабильным в долгосрочной перспективе. Я бы предпочел использовать link_to и paths, но проблема в том, что мой инициализатор загружается до маршрутов. Это делает невозможным вызов category_path, например. Как я могу решить это? Как я могу сделать так, чтобы файл category_tree.rb загружался ПОСЛЕ того, как загружается rout.rb?

  2. Я не знаю, очень ли разумно использовать такую ​​глобальную переменную. Я предполагаю, что он будет постоянно хранить в памяти мое дерево категорий html, что, я полагаю, не слишком умно. Это правильно?

Я бы предпочел, чтобы при запуске я создавал партиал, содержащий мое дерево категорий html, в котором я могу использовать маршруты / пути. Решение, которое не нужно будет хранить в памяти. Как я могу решить это?

1 Ответ

2 голосов
/ 23 января 2012

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

http://guides.rubyonrails.org/caching_with_rails.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...