【问题标题】:Caching page based route in Rails?在 Rails 中缓存基于页面的路由?
【发布时间】:2013-02-25 09:25:41
【问题描述】:

我正在尝试在我的 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

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

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

【问题讨论】:

    标签: ruby-on-rails caching


    【解决方案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 使缓存过期。例如

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

    【讨论】:

    • 如果调用“policies/available/CA”,这不会返回“policies/available/US”的 JSON 结果吗? (那将是一个问题。)我的数据根据​​参数更改,我不想返回与查询不匹配的数据。
    • 是的,你是对的。我想念你问题中的路线。我会更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2016-04-08
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多