Rails:在服务器启动时预加载/创建部分

时间:2012-01-23 12:58:23

标签: ruby-on-rails

我有一个带有类别树的Web应用程序,该类别树在主页上发布,大约有1200个类别。此类别树是使用acts_as_tree(parent_id等)构建的,它使用<ul><li>在html中构建树。

如果我直接发布树,它的效果非常好,但实际上非常慢(加载时间约为4秒),这显然不适合主页。

好处是这个类别树很少改变,因此它可以在服务器启动时构建。因此,我所做的是创建一个初始化程序category_tree.rb并将其放在initializers文件夹中。

我创建了一个全局变量$ 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和路径,但问题是我的初始化程序在routes.rb之前加载。这使得无法调用category_path作为示例。我怎么解决这个问题?如何在载入routes.rb之后加载category_tree.rb?

  2. 我不知道使用这样的全局变量是否非常聪明。我想它会一直将我的类别树html保存在内存中,我认为这不是太聪明。这是对的吗?

  3. 我更喜欢的是我在启动时创建部分包含我的html类别树的情况,我可以在其中使用路径/路径。一种不需要在内存中保留任何内容的解决方案。我该如何解决?

1 个答案:

答案 0 :(得分:2)

看起来你应该在渲染后尝试缓存页面。更改后,使缓存无效并自行加载以存储新的缓存版本。

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