2012-11-21 33 views
1

我想跟蹤用戶訪問網站的次數。訪問計數器(用戶模型的一部分)會在30分鐘前訪問時增加。我正在使用Rails和Devise:用Devise在Rails中存儲用戶訪問次數

class ApplicationController < ActionController::Base 
    before_filter :authenticate_user! 
    before_filter :update_visits 

    def update_visits 
    current_user.increment!(:visits) if !current_user.nil? && current_user.updated_at < 30.minutes.ago 
    end 
end 

這會工作的很好,除非我有設計:可記住打開。所以SQL調用的序列來自:authenticate_user!是這樣的:

選擇 「用戶」 * FROM 「用戶」 WHERE 「用戶」, 「電子郵件」= '[email protected]' LIMIT 1

UPDATE 「用戶」 SET 「remember_created_at」=。 '2012年11月21日20 :13:53.011322' 「的updated_at」= '2012年11月21日20:13:53.012791' WHERE 「用戶」, 「ID」= 1

所以訪問。變量永遠不會增加,因爲updated_at被設置爲可記憶調用中的當前時間。如何在認證之後但在可記憶之前將update_visits調用?

謝謝

回答

0

我用Warden來解決這個問題。

初始化/ devise.rb:

Warden::Manager.after_set_user do |user,auth,opts| 
    user.increment(:visits).save! if user.updated_at < 30.minutes.ago 
end 
0

我覺得你的任務並不那麼簡單。如果您可以記住,則應該不通過登錄來跟蹤用戶的活動。應該有一個標準設置你稱之爲「活動」的標準:它只是返回到應用程序的頁面,或者點擊鏈接或按鈕。在從零開始的關於認證的Railscast中,存在認證背後的邏輯。可能會有解決方案?就像在爲current_user檢查會話時設置回調一樣。

編輯:看看this discusion。有多種方法可以通過Warden::Manager跟蹤當前用戶的身份驗證請求時間。

+0

肯定的,那將是一種方法,一個擴展的解決方案。目前,我只想讓網站上的任何用戶活動觸發「updated_at <30.minutes.ago」檢查。 – Arman

+0

謝謝,我最終使用了warden:manager來解決它。我發佈了我的代碼。 – Arman

+0

這真的很棒。我已經同時啓動了相同的應用程序功能。 –

相關問題