こんにちは、エンジニアのさもです。
仕事で「初回ログイン日時を登録できるようにして」と言われたときにやったことのメモです。
スポンサーリンク
はじめに
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関連のネタでした。
プログラミング歴が長い方なら、特に問題なく思いつくことかも知れませんが、検索してもあまり情報が出てこなかったので記事にしてみました。