使用 rake在 Rails 中从视图生成静态 html?

问题描述

我有一个加载速度极慢的站点地图样式的视图,它遍历类别树,带有条件的子类别(其他对象的)等等。这是一团糟,但我相信网站需要它。我已尽力创建智能查询,但仍处于 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