webエンジニアさもの挑戦

RubyやPython, JavaScriptなど勉強したことなど、IT関連の記事を書いています

ビットコイン取引高日本一の仮想通貨取引所 coincheck bitcoin

Deviseを使うときに、初回ログイン日時を登録する方法

f:id:s-uotani-zetakansu:20170822124329j:plain

こんにちは、エンジニアのさもです。

仕事で「初回ログイン日時を登録できるようにして」と言われたときにやったことのメモです。

スポンサーリンク

はじめに

Railsアプリでログイン機能を実装するとき、多くのプロジェクトでdeviseを採用されているかと思います。

今私が入っているプロジェクトでもdeviseを採用しています。

deviseで使えるカラム

deviseではlast_sign_in_atカラムとcurrent_sign_in_at カラムを対象のモデルに持たせておけば、ログイン時に自動で更新してくれるんですね。

ちなみに、

  • last_sign_in_at

    • 最終ログイン日時。実際は前回ログイン日時。
    • 初回ログイン時には、ログイン時刻が入る
    • 2回目以降は、更新前のcurrent_sign_in_atが入る
  • current_sign_in_at

    • 現在ログイン日時。実質の最終ログイン日時
    • 初回ログイン時には、ログイン時刻が入る
    • 2回目以降も常にログインした時刻で更新される

という違いがあります。

本当の最終はcurrentの方なのですね。

初回ログイン日時の登録

本題に入ります。

やりたかったことは、first_sign_in_atカラムを追加して、そこへ初回ログイン日時を登録することです。

deviseが勝手にやってくれるのかなと期待していたのですが、やってくれませんでした。

そこで、更新用のメソッドを追加します。

プロジェクトないでは、おそらく次のようになっているのではないでしょうか

Users::SessionsController < Devise::SessionsController

  def create
    固有の処理
    super
  end
end

ここへ、ログインした後に実行したい処理を追加します。

Users::SessionsController < Devise::SessionsController

  after_filter :after_login, :only => :create

  def create
    固有の処理
    super
  end
  
  private

  def after_login
    current_user.update(first_sign_in_at: current_user.current_sign_in_at) unless current_user.first_sign_in_at
  end
end

after_filterでcreate後に実行したいメソッドを登録しておきます。

after_loginメソッドで、初回ログイン日時を更新するようにします。

ここで、current_user.sign_in_count == 0を判断基準としていないのは、今のプロジェクトがすでにリリース済みで、sign_in_countが0でないユーザにも初回ログイン日時を登録するためです。

最後に

久しぶりにruby関連のネタでした。

プログラミング歴が長い方なら、特に問題なく思いつくことかも知れませんが、検索してもあまり情報が出てこなかったので記事にしてみました。