2013-03-10 31 views
0

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

例子:

的config/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 

呼唤 “政策/可/ US” 将缓存JSON结果为该路由,然后调用“策略/可用/ CA”将高速缓存一个该seco的JSON结果nd路线。 (又名一个结果每个路由缓存,但同样的看法/控制器)。

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

回答

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 
+0

如果调用“policies/available/CA”,这不会返回“policies/available/US”的JSON结果吗? (这将是一个问题。)我的数据根据​​参数更改,我不想返回与查询不匹配的数据。 – 2013-03-10 01:16:53

+0

是的,你是对的。我想念你的问题阅读路线。我会更新答案。 – Sam 2013-03-10 01:25:46