2010-02-26 127 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等框架結合也很容易。