【Rails】devise Gemのオーバーライド(new メソッド編)

初めに

こんにちは、GMOアドマーケティングのryoutakoです。
普段はRuby on Railsを使った開発やプロダクトの脆弱性診断などセキュリティ関連の仕事をしています。

今回のブログはRuby on Railsdevise Gemについての内容です。  

経緯

みなさんはRuby on RailsのGemをオーバーライドして実装したことはあるでしょうか?さまざまな理由で独自の機能を追加したくなり、オーバーライドした経験のある方も多いと思います。

私も最近開発をしていてdeviseのDevise::SessionsControllerをオーバーライドする機会がありました。そしてその際にdeviseのコード(特にnewメソッド)を読み込んだのでその内容を本ブログで共有します。

今後devise Gemのオーバーライドをする方のお役に立てれば幸いです!

deviseとは

deviseはRuby on Railsアプリケーションに認証機能を追加するためのGemです。ユーザーのサインアップ、ログイン、ログアウト、パスワードのリセットなどの一般的な認証機能を提供します。
devise Gemのソースコード

newメソッド解説

今回はnewメソッドについて解説していきます。
v4.9.0現在の実装↓

 概要

Devise::SessionsControllerのnewメソッドでは新しいセッションを作成するためのログインフォームの表示を行います。

1, self.resource = resource_class.new(sign_in_params)

resource_class(deviseで定義したユーザーのクラス)の新しいインスタンスを作成しself.resourceに格納します。sign_in_paramsにはログイン画面で入力したメールアドレスやパスワードの情報が入っており、認証失敗で再度ログイン画面に飛ばされた時のために一度入力した情報を含むようになっています。

2, clean_up_passwords(resource)

resourceに含まれるパスワード関連の情報を空にします。これにより既存のパスワード関連の情報が表示されないようになります。

3, yield resource if block_given?

ブロックが渡された際にそのブロックパラメータにresourceを代入します。これにより(主に開発者が)ブロックを渡して追加の処理を行うことができるようになります。RegistrationsControllerのクラスなどで使用されています。

4, respond_with(resource, serialize_options(resource))

ログイン画面のテンプレートを表示します。serialize_options(resource)にはそのユーザの認証に何が必要かの情報(メアドやパスワード)が入っており、それらをまとめてログインフォームを作ってくれます。  

オーバーライドの方法

deviseの初期設定として、アカウントとなるクラスのコントローラの作成を行なった時に、以下のような中身になったと思います。オーバーライドする場合はコメントを取り除いて行います。

 newメソッドをオーバーライドする場合

基本的には↓のようにsuperを使用しつつオーバーライドすることをお勧めします。(理由は後述) また、↓のようにコードを直接書いてオーバーライドすることもできます。superのオーバーライドよりもより細かいところに修正を加えることができますが、superを使用しない場合はdevise Gemのアップデートでnewメソッドの内容が変わった場合にオーバーライドした部分も修正が必要になります。ここを理解しておかないとnewメソッドだけバージョンアップが適用されてないなんて事態も起こりうるかもしれません。 なので↑のやり方でやる場合は覚悟(アップデート)の準備をしておいて下さい。

最後に

今回はdevise Gemについて書いてみましたがいかがだったでしょうか?

なかなかGemのソースコードを読む機会はなく今回でかなり勉強になったので、もし別のソースコードを読む機会があったらまた書いてみたいと思います。

ここまで読んでいただきありがとうございます!!