我有一个带有类别树的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 %>
这一切都有效!它加载速度快且正确。但是,我有一些问题需要帮助:
从长远来看,使用<a href>
将不会非常稳定。我更喜欢使用link_to和路径,但问题是我的初始化程序在routes.rb之前加载。这使得无法调用category_path作为示例。我怎么解决这个问题?如何在载入routes.rb之后加载category_tree.rb?
我不知道使用这样的全局变量是否非常聪明。我想它会一直将我的类别树html保存在内存中,我认为这不是太聪明。这是对的吗?
我更喜欢的是我在启动时创建部分包含我的html类别树的情况,我可以在其中使用路径/路径。一种不需要在内存中保留任何内容的解决方案。我该如何解决?
答案 0 :(得分:2)
看起来你应该在渲染后尝试缓存页面。更改后,使缓存无效并自行加载以存储新的缓存版本。