0

我正在尝试在我的 Rails 应用程序中实现缓存。我的控制器中的视图会根据传入的参数生成一个非常大的项目列表。这个大列表不会经常更改,所以我想根据路由缓存它。

例子:

配置/路由.rb:

get "policies/available/:country" => 'policy#available', :format => :json

策略控制器.rb:

class PolicyController < ApplicationController

  def available
    country = params[:country]
    @policies = VideoPolicy.available_in_country country
    respond_to do |format|
      format.html
      format.json{
        render :json => @policies.to_json
      }
    end
  end
end

调用“polices/available/US”会缓存该路由的 JSON 结果,然后调用“polices/available/CA”会缓存第二个路由的 JSON 结果。(也就是每条路由缓存一个结果,但用于同一个视图/控制器。)

我将如何做到这一点?某种形式的页面/动作/片段缓存

4

1 回答 1

1

页面缓存可能是您正在寻找的。

class PolicyController < ApplicationController
  cache_page :available

  ...additional code...
end

当可用的操作被命中时,Rails 将在公共目录中创建一个静态 JSON 文件,policies/available/US.json假设您的路由是policies/available/US.json.

因为现在公共目录中有一个与 Rails 路由匹配的文件,所以 Web 服务器将访问静态文件并丢失 Rails 应用程序。

然后,您可以expire_page在更新或创建操作后使缓存失效。例如

def update
  @policy = VideoPolicy.find(params[:id])
  if @policy.update_attributes(params[:video_policy])
    expire_page "/policies/available/#{@policy.country}.json"
  end
end
于 2013-03-10T01:10:30.433 回答