Rails – Deviseのコントローラをカスタマイズする方法

Railsの認証エンジン「Devise」のコントローラをカスタマイズする方法を紹介します。

 

コントローラファイルの作成

Deviseをインストールしてもそのコントローラは生成されません。Deviseが内部的に持っているコントローラが使用されます。そのため、Deviseのコントローラの挙動を変えたい場合は、そのDeviseのコントローラクラスを継承した独自のコントローラを作成する必要があります。

認証用のモデルを「User」という名前にした場合、app/controllers/usersディレクトリ配下にsessions_controller.rbとregistrations_controller.rbという2つのコントローラファイルを作成します。前者はユーザのログイン/ログアウト機能のコントローラで、後者はユーザ登録機能のコントローラになります。それぞれソースコードは以下のようにします。

class Users::SessionsController < Devise::SessionsController

  def new
    super
  end

  def create
    super
  end
end
class Users::RegistrationsController < Devise::RegistrationsController

  def new
    super
  end

  def create
    super
  end

end

ポイントはクラスの宣言部分です。 Devise::SessionsControllerとDevise::RegistrationsControllerをそれぞれ継承して、親クラスのnewメソッドとcreateメソッドをオーバーライドしています。独自の処理を加えたい場合は、これらのメソッド内に処理を追加すればよいわけです。

 

Deviseで使用するコントローラファイルの指定

上記で作成したコントロールファイルをDeviseが使用するように設定を記述する必要があります。config/routes.rbファイルのDeviseに関する設定を以下のように変更します。

devise_for :users, :controllers => {
  :sessions => 'users/sessions',
  :registrations => 'users/registrations'
}

:controllersオプションで使用するコントローラを指定しています。ちなみに'users/sessions'のusersはapp/controllers/usersディレクトリのことを表し、sessionsはsessions_controller.rbファイルの先頭を表しています。そのため、実際のディレクトリ構造とファイル名とがこの設定と一致していないとうまく動きません。

 

使用するコントローラが切り替わっていることを確認

最後に以下のコマンドを実行してDeviseが使用するコントローラが今回作成したコントロールになっているか確認しましょう。
> rake routes

devise_controller_changed_routes

 

環境

Rails 3.2.9
Devise 2.1.2

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です