2011-05-22 28 views
4

我會從描述一個場景開始,我會接受其他方式來做這件事,但我想不出任何其他方式。知道什麼時候在Rails中啓動一個新的會話

我在Rails 2應用程序上有匿名用戶。當一位新用戶訪問該網站時,我想要放一個「我已經訪問過該網站1次」的cookie並將其記錄在我們的系統中。用戶離開並回來一個月後,我讀了這個cookie,增加了訪問次數(「我已經在這裏2次了」),並將其記錄在我們的系統中。

我的計劃:

當一個新的會話開始

  • 如果用戶是新的 - 創建的cookie,記錄訪問
  • 如果用戶正在恢復 - 讀取Cookie,增加值,寫cookie,日誌訪問

我現在被卡住的地方是在「新會話開始時」步驟。如果你有.net背景,我正在尋找的是ASP.NET中Session_Start的等價物。我可能查詢每個請求上的數據庫,並檢查是否已經記錄了一個特定的會話ID,但這似乎效率低下。

+0

但是rails會隨機設置session_id,那麼如何告訴guest用戶你被訪問了2次? – Arun 2011-05-22 07:31:01

+0

session_id在每個請求中都不是隨機的。我想知道什麼時候開始新的會議,這將是理想的。如果沒有,我將不得不將當前的session_id與記錄的會話ID列表進行比較。我寧願不這樣做。 – user140550 2011-05-22 16:02:00

回答

1

其實這是一個壞主意。 Rails將會話存儲在數據庫或文件系統中(tmp/sessions)。如果你想知道,如果用戶之前在頁面上,你只是不要刪除會話(沒有會話過期)。但是屆時會議的數量將會增長到無限。

如果用戶使用相同的瀏覽器在同一臺機器上返回,則會話將仍然存在。在你的應用程序/會話控制器,你可以這樣做:

session[:visits] ||= 0 
session[:visits] += 1 

但隨後它會隨着每次點擊而增加。因此,如果您只想計算訪問次數,則需要存儲最後一次點擊時間,如果用戶離開了半個多小時左右,則只需增加。

session[:visits] ||= 0 
now = DateTime.now.to_i 
session[:visits] += 1 if session[:last_click] && session[:last_click] < (now - 60*30) 
session[:last_click] = DateTime.now.to_i 

仍然是一個糟糕的主意,因爲如果在不同的瀏覽器或計算機的用戶返回時,計數器將重新開始。 (關於會話的更多信息:http://ruby.railstutorial.org/chapters/sign-in-sign-out#sec:sessions

+0

最終以cookies而不是會話的方式做了這樣的事情。 – user140550 2011-05-25 19:18:08

相關問題