1

ユーザーがサイトにアクセスした回数を追跡したいと考えています。以前の訪問が 30 分以上前の場合、訪問カウンター (ユーザー モデルの一部) が増加します。私はRailsとDeviseを使用しています:

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

devise :rememberable をオンにしている場合を除いて、これはうまく機能します。したがって、:authenticate_user! からの一連の SQL 呼び出しは次のようになります。これは:

SELECT "users".* FROM "users" WHERE "users"."email" = 'person_1@example.com' 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 が記憶可能な呼び出しで現在の時刻に設定されているため、visits 変数がインクリメントされることはありません。認証後、記憶可能になる前に update_visits 呼び出しを行うにはどうすればよいですか?

ありがとうございました

4

2 に答える 2

0

あなたの仕事はそれほど単純ではないと思います。覚えている場合は、サインインするのではなく、ユーザーのアクティビティを追跡する必要があります。「アクティビティ」と呼ばれるものを基準に設定する必要があります。それは、アプリのページに戻るだけなのか、リンクやボタンをクリックしただけなのかです。ゼロからの認証に関するRailscastには、認証の背後にあるロジックがあります。おそらく解決策があるでしょうか?セッションで current_user をチェックするときにコールバックを設定するのと同じです。

編集:この議論を見てください。Warden::Managerを介して現在のユーザーからの認証リクエストの時間を追跡する方法はいくつかあります。

于 2012-11-21T21:45:51.760 に答える
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
于 2012-11-22T23:41:01.757 に答える