rails中的caches_page,json格式

时间:2012-10-12 23:16:06

标签: ruby-on-rails ruby ruby-on-rails-3 json caching

我有一个设置缓存json调用的应用程序。我尝试了各种代码语法,当我有以下内容时,它似乎只能正确缓存:

    caches_page :index, :gzip => true
    cache_sweeper :institutes_sweeper

    respond_to :json, :js

    def index
      @institutes = Institute.select([:id, :name]).all
      render :json => { :institutes => @institutes }
    end

现在,当它被击中时,它呈现一个html文件,缓存按预期工作。 Rails堆栈没有被击中。

如果我抛出一个格式块并让渲染器响应json,缓存将创建文件;但是,它将在下次创建另一个文件并忽略已存在的文件。

是否必须以不同的方式配置apache才能按预期工作?

另外,我想使用public / cache /作为存储缓存的目录。我正确配置了导轨;但是,我想知道如何配置apache来提供那些缓存的文件(上面的相同问题发生在创建文件但未提供的情况下)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

我想在这里解决问题。

需要告知Apache缓存文件所在的位置。它只是存储在公共区域时工作的原因是因为这是默认情况下apache的行为。将以下配置添加到您定义虚拟主机

的位置
RailsAllowModRewrite On
RewriteEngine On

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -f
RewriteRule ^/[^.]+$ /cache/%1.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.json -f
RewriteRule ^/$ /cache/index.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.html -f
RewriteRule ^/[^.]+$ /cache/%1.html [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.html -f
RewriteRule ^/$ /cache/index.html [QSA,L]

现在,解决了json渲染html的问题,我发现这是因为我在应用程序控制器中调用了在实际函数执行之前执行的。如果我对这些函数使用skip_before_filter,我会更近一步。

我还发现将响应包装在格式块中会更好。

respond_to do |format| 
  format.json { json: { institutes: @institutes } }
end

这将导致json成为缓存,服务器配置将导致正确地提供服务。

我相信对于那些使用Nginx的人,应该使用以下配置(尽管不是100%确定)

    if (-f $request_filename/index.html) {
      rewrite (.*) $1/cache/index.html break;
    }

    if (-f $request_filename/index.json) {
      rewrite (.*) $1/cache/index.json break;
    }

如果有人对上述代码有任何反馈,我很乐意听到。谢谢!