10

サイトの大部分をページキャッシュできると確信していますが、そうすることを妨げているのは、フラッシュメッセージが表示されないか、間違った時間に表示されることです。

私が検討していることの1つは、フラッシュメッセージをCookieに書き込み、それを読み取ってjavascriptで表示し、メッセージが表示されたらCookieをクリアすることです。誰かがこれを行うことに成功したことがありますか、それともより良い方法がありますか?

ありがとう。

4

7 に答える 7

8

キャッシュ可能なフラッシュはこれを行います:

アプリケーションコントローラー内:

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内にメッセージを挿入します

于 2011-03-02T20:22:51.790 に答える
4

私は同じ問題を扱っていて、KJFが質問で説明したことを正確に実行するcacheable-flashプラグインを見つけました。

これは、過度のajax呼び出しを行うよりも簡単で優れたソリューションだと思います。

于 2010-05-22T08:29:38.043 に答える
2

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

お役に立てれば、

チェイスグレイ

于 2010-02-26T19:06:14.343 に答える
0

ページ全体をキャッシュする必要はありません。フラグメントキャッシングAPIをお試しください

于 2010-02-26T18:16:52.557 に答える
0

古い質問...しかし、フラッシュメッセージをキャッシュキーに含めることでこれを回避しました。

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 }
}

ショーアクションにフラッシュメッセージがある場合、これは明らかにキャッシュを頻繁に破壊しますが、多くのメッセージを実行していない場合はうまく機能します。

于 2012-08-16T20:05:10.830 に答える
0

Unobtrusive Flashは、FlashメッセージをCookieに入れ、JavaScriptを介して表示します。バニラとブートストラップフレーバーのJS表示ロジックを提供します。通常のリクエストとajaxリクエストで機能します。AngularJSなどのフレームワークに簡単に接続することもできます。

于 2012-10-12T06:05:52.237 に答える
-1

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に挑戦した人のためにそれを分解します:

  1. フラッシュメッセージを追加するときは、一意のIDを作成し、そのメッセージと一緒に保存します。
  2. メッセージを表示する前に、メッセージの一意のIDで名前が付けられたCookieが設定されているかどうかを確認します。
  3. そのCookieが設定されていない場合は、メッセージをフラッシュしてCookieを設定します。クッキーは1日で、または賢明だと思う限り短く期限切れにしてください。

これで、このページがキャッシュから取得されれば問題ありません。手順2では、Cookieがすでに設定されているため、Cookieのテストに合格し、メッセージは表示されません。

于 2010-07-10T10:07:15.510 に答える