0

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」を呼び出すと、その 2 番目のルートの2 番目の JSON 結果がキャッシュされます。(別名、ルートごとに 1 つの結果がキャッシュされますが、同じビュー/コントローラーに対してです。)

どうすればこれを達成できますか? ページ/アクション/フラグメント キャッシングの何らかの形式

4

1 に答える 1

1

ページキャッシングはあなたが探しているものかもしれません。

class PolicyController < ApplicationController
  cache_page :available

  ...additional code...
end

policies/available/US.json使用可能なアクションがヒットすると、Railsはルートがであると仮定して呼び出されるパブリックディレクトリに静的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 に答える