1

ユーザーのサインインストリーク (日) をデバイスでカウントしようとしています。

新しい列 time_since_sign_in integer をユーザー テーブルに追加しました。

デバイス セッション コントローラーのオーバーライド

devise_for :users, controllers: { sessions: "sessions" }

サインインする前にattrを更新すると思ったこれを追加しました

class SessionsController < Devise::SessionsController
  def create
    current_user.update_sign_in_streak
    # even if i comment out super, last_sign_in_at still gets updated
    super
  end
end

ユーザーモデルに追加

def update_sign_in_streak
  # binding.pry
  # at this point last_sign_in_at always updated
  time_since_sign_in = Time.now - last_sign_in_at
  if time_since_sign_in.between?(1.day, 2.day)
    increment! :sign_in_streak
  elsif time_since_sign_in > 2.day
    sign_in_streak = 0
    save
  end
end

どうやらdeviseにはこのフックがあり、追跡フィールドを更新します。しかし、作成が成功する前に呼び出されるのはなぜですか? これを機能させる方法についてのアイデアはありますか?

Warden::Manager.after_set_user :except => :fetch do |record, warden, options|
  if record.respond_to?(:update_tracked_fields!) && warden.authenticated?(options[:scope]) && !warden.request.env['devise.skip_trackable']
    record.update_tracked_fields!(warden.request)
  end
end
4

1 に答える 1