在Rails中预构建视图缓存

use*_*168 6 caching ruby-on-rails

有没有办法预先构建页面缓存而不通过http请求调用实际页面?

我看着像解决这个这个,但这些不生成缓存.

我有一个相对复杂的视图,并希望缓存整个事情.我想在应用程序中预先构建这个缓存​​版本,这样当用户实际点击它时,它就已经存在了.

谢谢

小智 0

我认为以下链接应该给您一个良好的开始。 如何在不访问网页的情况下获取控制器操作的渲染输出?

我尝试完成相同的任务,据我所知,您的虚假请求应该具有正确的主机,因为缓存密钥包含主机信息。

我通过使用 ActionController::Integration::Session 完成了缓存

ais = ActionController::Integration::Session.new
ais.host = host
ais.xml_http_request(:post, url, params, headers)
Run Code Online (Sandbox Code Playgroud)

我还有另外一个:

class FakeRequest
  include ActionController::UrlWriter

  def initialize(url, params, session, host)
    @url = url
    @params = params
    @session = session
    default_url_options[:host] = URI.parse(host).host
  end

  def post
    process(:post)
  end

  def get
    process(:get)
  end

  def xhr
    process(:post, true)
  end

  def process(method, ajax = false)
    uri = URI.parse(url_for(@url))
    request = ActionController::TestRequest.new({'HTTP_HOST' => uri.host,'rack.input' => '','rack.url_scheme' => 'http'})
    request.query_parameters = @params
    request.path = uri.path
    request.host = uri.host
    request.env['REQUEST_METHOD'] = method.to_s.upcase
    if ajax
      request.headers['X-Requested-With'] = 'XMLHttpRequest'
    end
    @session.each_pair do |k,v|
      request.session[k] = v
    end

    response = ActionController::TestResponse.new

    controller = ActionController::Routing::Routes.recognize(request).new
    return controller.process(request, response)
  end
end
Run Code Online (Sandbox Code Playgroud)

这也将返回响应对象。