10

我很确定我可以对我网站的绝大多数内容进行页面缓存,但阻止我这样做的一件事是我的 Flash 消息不会显示,或者它们会在错误的时间显示。

我正在考虑的一件事是将 Flash 消息写入 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 读取“flash”cookie 并将消息插入 HTML

于 2011-03-02T20:22:51.790 回答
4

我正在处理同样的问题,我发现cacheable-flash插件完全符合问题中 KJF 的描述。

我认为这比进行过多的 ajax 调用更简单、更好的解决方案。

于 2010-05-22T08:29:38.043 回答
2

一种解决方案是缓存页面,但包含一个 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

老问题......但我通过将闪存消息包含到我的缓存键中来解决这个问题。

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 显示。它提供了香草和 Bootstrap 风格的 JS 显示逻辑。它适用于普通和 ajax 请求。它也很容易与 AngularJS 等框架挂钩。

于 2012-10-12T06:05:52.237 回答
0

您不必缓存整个页面。尝试片段缓存API

于 2010-02-26T18:16:52.557 回答
-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. 添加 Flash 消息时,您会创建一个唯一 ID 并将其与该消息一起存储。
  2. 在显示消息之前,请检查是否设置了以消息的唯一 ID 命名的 cookie。
  3. 如果该 cookie 尚未设置,则闪烁消息并设置 cookie。在一天内使 cookie 过期,或者您认为明智的简短。

现在,如果从缓存中提取此页面,就可以了。在第 2 步,cookie 的测试将通过,因为它已经设置,并且不会显示消息。

于 2010-07-10T10:07:15.510 回答