2016-05-04 8 views
1

、私はそう(簡体字)のように、fresh_whenを使用しています:ロケールが変更されたときに条件付きGETキャッシュを期限切れにする方法は? JSON APIの場合

class BalancesController < ApplicationController 
    def mine 
    fresh_when(current_user.balance) 
    end 
end 

これはてETag(もし-なしマッチ)とupdated_atの(場合 - 変更 - 以降)だけで罰金で動作します。

ただし、異なる言語のキャッシュを無効にしたいとします。簡体字:

class BalancesController < ApplicationController 
    before_action :set_locale 
    def mine 
    fresh_when(current_user.balance) 
    end 

    private 
    def set_locale 
    @locale = locale_from_headers 
    end 
end 

locale_from_headersはより複雑libですが、この例では、ヘッダ"Accept-Language: nl"または"Accept-Language: en"@locale:nlまたは:enのいずれかであることになりますと言うのに十分です。

私はetagとif-modifiedでこれを使用したいと思います。 fresh_whenは、異なる言語を要求するときにキャッシュされた応答を返しません。ようなので:

  • get /balances/mine, {}, { "Accept-Language" => "en" }#=>応答200 OK
  • get /balances/mine, {}, { "Accept-Language" => "en", "If-None-Match" => previous_response.headers["ETag"] }#=>応答304変更されない
  • get /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }#=>応答200 OK
  • get /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }#=>応答304は、
  • を改変しません

したがって、応答はキャッシュされ、ロケールがキャッシュされたバージョンと一致する場合にのみ304として返されます。

cache()ブロックでは、Railsでのフラグメントキャッシングを使用して、adding a locale is simplefresh_whenメソッドで同じようにするにはどうすればよいですか?

答えて

0

解決策は簡単でした。しかし、etagsは-方法でのみ動作します:変更した場合は-ので

If-Modified-Since方法で

class BalancesController < ApplicationController 
    etag { current_locale } 

    def mine 
    fresh_when(etag: current_user.balance) 
    end 

    private 
    def current_locale 
    @locale ||= locale_from_headers 
    end 
end 

、キャッシュを期限切れにすることはできません。 Conditional GETを使用している場合、Railsはキャッシュを保存しませんが、タイムスタンプで渡された比較とオブジェクトに対するタイムスタンプのみを比較します。

どちらも「Just a Date」より多くの情報を運ぶことはできません。作成された言語を保存するために、キャッシュを保存するためのレール(フラグメントキャッシュなど)が必要です。このメソッドでは、言語ヘッダーに基づいてキャッシュを期限切れにすることはできません。唯一etagオプションを渡すことによって

IF-変性のでヘッダは無視される:fresh_when(etag: current_user.balance)これは、あるコンテンツの識別子をエンティティタグを表し、場合-なしマッチ

サービスされました。通常、これは返されるオブジェクトのオブジェクトIDを使用して構築されます。

条件付き取得では、追加のエタージェントビルダー(etaggersto be defined)を使用できます。

エンティティタグに余分な情報を追加するために使用できます。

関連する問題