我正在尝试在我的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?
答案 0 :(得分:1)
页面缓存可能正是您所寻找的。 p>
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