Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中缓存JSON结果_Ruby On Rails_Caching - Fatal编程技术网

Ruby on rails 在Rails中缓存JSON结果

Ruby on rails 在Rails中缓存JSON结果,ruby-on-rails,caching,Ruby On Rails,Caching,我有一个控制器,当它接收到对/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

我有一个控制器,当它接收到对/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
我注意到,每当向/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)

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

您的缓存目录可能位于错误的位置。我以前尝试将缓存放置在public以外的目录中时遇到过此问题。

我认为您可能是正确的,您可以指定:cache\u path选项来告诉它如何命名文件,然后执行此操作

caches_page :index, :cache_path => '' # if not try 'tags'
如果要包含参数,还可以传递一个proc

caches_page :index , :cache_path => Proc.new {|controller| controller.params }

或者其他任何东西

Hmm,我试过了,但它仍然显示出保存到/public/tags.json的相同行为。页面缓存的工作方式是,它只是在公共场合生成静态页面,这些页面被web服务器抓取,而从未接触过rails。因此,您必须让rails以不同的名称保存它们,或者让您的Web服务器Apache或其他任何具有该文件别名的文件。或者让客户端请求具有扩展名的页面。至少我认为这样的东西应该可以工作如果它只在json中回复,去掉respond_to block,这就是添加.json的原因。但是要使用它,我们需要安装actionpack-page_缓存gem,核心本身就没有这样做的方法吗?