在Rails中缓存基于页面的路由?

时间:2013-03-10 00:43:16

标签: ruby-on-rails caching

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

示例:

配置/ routes.rb中:

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

policy_controller.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结果。 (例如,每个路由缓存一个结果,但对于同一个视图/控制器。)

我将如何做到这一点?某种形式的page/action/fragment caching

1 个答案:

答案 0 :(得分:1)

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

class PolicyController < ApplicationController
  cache_page :available

  ...additional code...
end

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

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

然后,您可以在更新或创建操作后使用expire_page使缓存过期。 E.g。

def update
  @policy = VideoPolicy.find(params[:id])
  if @policy.update_attributes(params[:video_policy])
    expire_page "/policies/available/#{@policy.country}.json"
  end
end