2015-10-21 62 views
2

假設我在Heroku上有一個Rails 4.2站點,上面有很多帖子。當查看帖子時,應用程序命中數據庫以從其他模型獲取帖子的數據和關聯數據。 遊客(非登錄用戶)到我的網站上看到的帖子,沒有任何自定義,所以顯示這些頁面應該不需要訪問數據庫。我怎樣才能建立簡單的網頁或動作緩存(或等同的)的所有遊客到我的網站,所以數據庫被跳過?我是否也可以讓CDN接管渲染這些頁面?如何爲訪問者添加頁面緩存到我的Rails應用程序?

回答

3

對於初學者,看看the Rails caching guide。頁面和動作緩存已經從Rails中刪除。

您可以嘗試片段緩存,它將抓取生成的帖子的HTML並將其存儲,儘管您將需要基於是否存在current_user的條件。

一個超簡單的版本可能看起來像:

應用程序/視圖/職位/ show.html.erb

<% cache_unless (current_user, @post) do %> 
    <%= @post.body %> 
<% end %> 

cache方法將是一個行動,如果該帖子存在高速緩存,並且如果該高速緩存不存在,則將生成動作並寫入動作。

緩存與一個ActiveRecord對象創建一個包含updated_at默認的關鍵,因此,如果一個崗位的變化,加載後會擁有更長的等待時間的第一位訪客,並且以後每訪客會得到緩存的好處。

至於你的其他問題,也有提供靜態頁面許多其他基於Ruby的工具,而所有這些的審查超出了我的知識,或許超出了這個問題的範圍。 :)

0

你不是真的想在這裏緩存。你只是想在這兩個控制器和視圖條件,像

# controller 
if logged_in? 
    @post = Post.find(params[:id]) 
    # load more records 
end 

# view 
<% if @post %> 
    <%= @post.title %> 
    ... 
<% else %> 
    You're not logged in, blah blah. 
<% end %> 

..假設控制器不僅僅是加載後紀錄。我不一定同意有條件地加載上面的記錄,但是您的用例可能需要它。

另外,如果你確實需要出於性能方面的緩存,你可以優雅地包括在片段緩存鍵像

<% cache "post-#{@post.id}-#{current_user ? current_user.id : 0}" do %> 
    <% if logged_in? %> 
    ... # expensive operations 
    <% else %> 
    Please login to see more.. 
    <% end %> 
<% end %> 

以便高速緩存可與用戶或anons相同的代碼當前用戶ID 。

1

蘭尼Bose的答案看起來真的是最好的,但我會添加此鏈接:

https://devcenter.heroku.com/articles/http-caching-ruby-rails#public-requests

整個頁面是有用的,但特別是它談論標記請求作爲公共或私人。它們在默認情況下是私有的,但如果您將其標記爲公開,則它允許頁面由中間代理緩存提供服務。

約架::緩存+內存緩存的代理緩存所鏈接的頁面會談;我不確定這是否仍然存在於rails 4中。

這第二頁的Heroku大約動作緩存會談,可以緩存特定的動作給你:

https://devcenter.heroku.com/articles/caching-strategies#action-caching

相關問題