サイトの大部分をページキャッシュできると確信していますが、そうすることを妨げているのは、フラッシュメッセージが表示されないか、間違った時間に表示されることです。
私が検討していることの1つは、フラッシュメッセージをCookieに書き込み、それを読み取ってjavascriptで表示し、メッセージが表示されたらCookieをクリアすることです。誰かがこれを行うことに成功したことがありますか、それともより良い方法がありますか?
ありがとう。
サイトの大部分をページキャッシュできると確信していますが、そうすることを妨げているのは、フラッシュメッセージが表示されないか、間違った時間に表示されることです。
私が検討していることの1つは、フラッシュメッセージをCookieに書き込み、それを読み取ってjavascriptで表示し、メッセージが表示されたらCookieをクリアすることです。誰かがこれを行うことに成功したことがありますか、それともより良い方法がありますか?
ありがとう。
キャッシュ可能なフラッシュはこれを行います:
アプリケーションコントローラー内:
after_filter :write_flash_to_cookie
def write_flash_to_cookie
cookie_flash = cookies['flash'] ? JSON.parse(cookies['flash']) : {}
flash.each do |key, value|
if cookie_flash[key.to_s].blank?
cookie_flash[key.to_s] = value
else
cookie_flash[key.to_s] << "<br/>#{value}"
end
end
cookies['flash'] = cookie_flash.to_json
flash.clear
end
次に、Javascriptを介して「フラッシュ」Cookieを読み取り、HTML内にメッセージを挿入します
私は同じ問題を扱っていて、KJFが質問で説明したことを正確に実行するcacheable-flashプラグインを見つけました。
これは、過度のajax呼び出しを行うよりも簡単で優れたソリューションだと思います。
1つの解決策は、ページをキャッシュすることですが、動的にしたいセクションに対してのみ別の小さなリクエストを行うjavascriptスニペットを含めます。したがって、ユーザーはページを完全にダウンロードし、javascriptが実行されると、動的ページ要素をプルダウンします。
しばらく前に、これについて短いブログ投稿を書きました。 http://chase.ratchetsoftware.com/2008/12/rails-caching-dynamic-fragments/
また、RailsEnvyのGreg Pollackは、キャッシュされたページに動的データを含めることに焦点を当てたスクリーンキャストを行いました。 http://railslab.newrelic.com/2009/02/05/episode-5-advanced-page-caching
お役に立てれば、
チェイスグレイ
ページ全体をキャッシュする必要はありません。フラグメントキャッシングAPIをお試しください
古い質問...しかし、フラッシュメッセージをキャッシュキーに含めることでこれを回避しました。
caches_action :show, cache_path: proc { |c|
most_recent_update_time = MyClass.order('updated_at DESC').limit(1).first.try(:updated_at).to_i
{ tag: most_recent_update_time.to_s + c.flash.collect{|x| x}.join }
}
ショーアクションにフラッシュメッセージがある場合、これは明らかにキャッシュを頻繁に破壊しますが、多くのメッセージを実行していない場合はうまく機能します。
Unobtrusive Flashは、FlashメッセージをCookieに入れ、JavaScriptを介して表示します。バニラとブートストラップフレーバーのJS表示ロジックを提供します。通常のリクエストとajaxリクエストで機能します。AngularJSなどのフレームワークに簡単に接続することもできます。
Railsは使用していませんが、PythonでUUIDを使用してこれを行った方法は次のとおりです。
# set flash messages like this
def flash(self, title, body):
session['flash_messages'].append({
'title': title,
'body': body,
'uuid': uuid().hex # stores a UUID as a string
})
...
self.flash('foo', 'bar')
次に、ベーステンプレートにこれがあります:
<script type="text/javascript">
{% for m in session.flash_messages %}
if(!Cookies.get('{{m.uuid}}')) {
Notify('{{m.title}}', '{{m.body}}');
Cookie.set('{{m.uuid}}', 'true', 86400); // key, value, expiry seconds
}
{% endfor %}
</script>
Pythonに挑戦した人のためにそれを分解します:
これで、このページがキャッシュから取得されれば問題ありません。手順2では、Cookieがすでに設定されているため、Cookieのテストに合格し、メッセージは表示されません。