在Rails中缓存JSON结果

Kev*_*ang 5 caching ruby-on-rails

我有以下控制器在收到对/ tags的HTTP请求时返回标记列表

class TagsController < ApplicationController
  caches_page :index

  def index
    respond_to do |format|
      format.json {
        render :json => Tag.all(:order => "name").to_json
      }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我注意到每当对/ tags发出请求时,Rails就会在/public/tags.json上生成一个缓存文件.但是,似乎永远不会使用此缓存文件.相反,它始终运行SQL查询来检索标记:

Started GET "/tags" for 127.0.0.1 at 2011-06-15 08:27:29 -0700
  Processing by TagsController#index as JSON
  Tag Load (0.7ms)  SELECT "tags".* FROM "tags" ORDER BY name
Write page <project root path>/public/tags.json (0.3ms)
Completed 200 OK in 35ms (Views: 1.1ms | ActiveRecord: 0.7ms)
Run Code Online (Sandbox Code Playgroud)

为什么Rails不使用正在生成的缓存文件?是因为请求是/ tags而不是/tags.json?

loo*_*non 2

我认为你可能是正确的,你可以指定选项:cache_path来告诉它如何命名文件,所以这样做

caches_page :index, :cache_path => '' # if not try 'tags'
Run Code Online (Sandbox Code Playgroud)

如果你想包含参数,你也可以传递一个过程

caches_page :index , :cache_path => Proc.new {|controller| controller.params }
Run Code Online (Sandbox Code Playgroud)

或其他任何东西

  • 页面缓存的工作方式只是在公共场合生成静态页面,这些页面由 Web 服务器抓取,而无需接触 Rails。因此,您必须让 Rails 用不同的名称保存它们,或者让您的网络服务器(Apache 或其他)拥有该文件的别名。或者让客户端请求带扩展名的页面。至少我认为类似的东西应该有效 (2认同)