Für eine JSON-API, ich fresh_when
verwende, wie so (vereinfacht):Wie konditionalen GET-Cache ablaufen, wenn Gebietsschema ändert?
class BalancesController < ApplicationController
def mine
fresh_when(current_user.balance)
end
end
Dies funktioniert mit ETags (If-None-Match) und updated_at (If-Modified-Since) gut.
Allerdings möchte ich den Cache für verschiedene Sprachen ungültig machen. Vereinfacht:
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
ist ein komplexeres lib, aber für dieses Beispiel ist es genug, um zu sagen, dass ein Kopf "Accept-Language: nl"
oder "Accept-Language: en"
in @locale
führt entweder :nl
oder :en
.
Ich möchte dies im Etag und wenn-modifiziert seitdem verwenden. So dass das Fresh_when eine zwischengespeicherte Antwort nicht zurückgibt, wenn eine andere Sprache anfordert. Wie so:
get /balances/mine, {}, { "Accept-Language" => "en" }
# => Antwort 200 OKget /balances/mine, {}, { "Accept-Language" => "en", "If-None-Match" => previous_response.headers["ETag"] }
# => Antwort 304 nicht modifizierte
get /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }
# => Antwort 200 OKget /balances/mine, {}, { "Accept-Language" => "nl", "If-None-Match" => previous_response.headers["ETag"] }
# => Antwort 304 nicht modifizierte
So werden Antworten zwischengespeichert und nur als 304 zurückgegeben, wenn die Ländereinstellungen mit der zwischengespeicherten Version übereinstimmen.
Mit cache()
Blöcke, mit Fragment-Caching in Rails, adding a locale is simple. Wie erreiche ich das Gleiche mit den fresh_when
Methoden?