问题描述
我有一个加载速度极慢的站点地图样式的视图,它遍历类别树,带有条件的子类别(其他对象的)等等。这是一团糟,但我相信网站需要它。我已尽力创建智能查询,但仍处于 400 多个查询和超长加载时间。
页面本身不会经常更改,并且可以轻松转换为静态 html 页面。我使用的是 200 天到期的 Memcachier。问题是 Memcachier 总是满的(我不想为更多空间支付额外的钱)所以我的感觉是它比那 200 天更频繁地推出这个缓存页面(我在我的 Scout 报告中看到它很多比这更频繁)。
我想做的是安排一个 rake 来“访问”页面并偶尔创建一个静态的 html 页面。那可能吗?在那种情况下,这怎么可能?
解决方法
在 Ruby/Rails 中渲染 ERB 模板非常简单,这里有一个例子。
给定这个模板
# You can place this really anywhere in your project
# lib/tasks/static.html.erb
<h1><%= Time.current %></h1>
<p><%= name %></p>
然后你可以像这样在你的 Rake 任务中使用它。 这样做是读取 ERB 模板文件,然后使用您提供的数据呈现它。最后,它将生成的 HTML 文件写入您应用的公共文件夹。
# lib/tasks/generate.rake
namespace :generate do
task static_generate: :environment do
html_result = template.result_with_hash(generate_data)
File.open(Rails.root.join('public/static.html'),'w') do |new_file|
new_file.puts(html_result)
end
end
def template
path = Rails.root.join('lib/tasks/static.html.erb')
file = File.open(path).read
ERB.new(file)
end
def generated_data
# Do your complicated logic here
# or delegate it to a class somewhere else
{ name: 'test123' }
end
end
然后你从终端调用你的佣金测试
rake generate:run