2010-02-26 83 views
10

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

我正在考虑的一件事就是将flash消息写入cookie,读取并通过javascript显示,并在消息显示后清除cookie。 有没有人有这样做或有没有更好的方法?

谢谢。

回答

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

希望这有助于

大通灰色

+0

我喜欢这个想法。似乎它可能是票。 – KJF 2010-02-26 21:16:31

+1

我认为值得注意的是,这不会实现页面缓存的全部好处,因为Rails过程每次都会被击中,而不是完全没有。但我想不出更好的解决方案。 – 2010-02-27 10:08:48

+3

片段缓存比服务第二个HTTP请求要好,它只请求可能包含在第一个HTTP请求中的数据。这种策略会使您所服务的HTTP请求数量翻倍。 – 2010-07-12 19:20:36

0

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

+0

也许他想缓存整个页面?页面缓存提供了最大的性能提升。 – 2010-02-26 18:25:51

+0

是的,正确的。目前我已经使用片段缓存来解决闪存问题。 – KJF 2010-02-26 21:16:02

4

我处理同样的问题,我发现cacheable-flash插件,不正是KJF的问题描述。

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

+0

我认为这是Rails的最佳方法。这个问题的其他答案大多建议您自己构建,但可缓存的闪存宝石已经解决了这个问题并很好地解决了这个问题。感谢安东和Pivotal实验室。 – GregT 2013-09-19 01:17:02

-1

我不使用Rails的,但是这是我使用UUID做了它在Python:

# 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的测试将通过,因为它已被设置,并且消息不会显示。

7

可缓存闪光灯做到这一点:

在应用程序控制器:

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

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

如果你对你的表演动作的提示信息这显然经常打破缓存,但效果很好,如果你不是做了很多消息。

0

Unobtrusive Flash将Flash消息放入cookie中,并通过JavaScript显示。它提供了香草和Bootstrap风味的JS显示逻辑。它适用于正常和ajax请求。与AngularJS等框架结合也很容易。