deviseのcontrollerの挙動を変える方法

f:id:ryoutaku_jo:20190205192844p:plain

【結論】
・deviseが既定しているcontrollerの挙動を
 変更するには、下記の手順が必要
 ・devise用のcontrollerを作成する
 ・作成したcontrollerをルーティングに追記する
 ・controllerに追加したい処理を記述する

・gemの仕様については、GitHubに細かく記載されているので、
 使用方法について分からないことがあれば、
 まずそちらを参照すべき


【目次】


【本題】

疑問→deviseが既定しているcontrollerの動きを変えるのはどうすれば良いか?

先日、reCAPTCHAを導入する方法をブログで取り上げましたが、
これの通りにやっても上手く行きませんでした(汗)

ryoutaku-jo.hatenablog.com

具体的に言うと、reCAPTCHAの判定結果を、
新たに作成した「registrations_controller」で取得しようとしても、
そちらに処理が飛ばず、reCAPTCHAの判定関係なく、
ログインが出来てしまう状態でした。

deviseの挙動を上手く変えられていない事が原因だと
考えられるので、改めて挙動を変える方法を調べました。

1:devise用のcontrollerを作成する

※既に、deviseの導入と、モデルは作成済みである前提で説明します。

deviseは、新規登録(registrations)やログイン(sessions)など、
アカウント認証の各機能毎にコントローラーを内部で作成しています。

なので、挙動を変える場合、
それらのコントローラーのクラスを継承した
コントローラーを新たに作成する必要があります。

下記のコマンドをターミナルで実行すると、
deviseが内部で作成しているコントローラーのクラスを
継承したコントローラーが一式生成されます。

rails g devise:controllers users」 ※usersの部分はモデル名に準じる

そして生成されるファイルが下記の通りです。

f:id:ryoutaku_jo:20190205192142p:plain

2:ルーティングに作成したcontrollerを追記する

※ここが前回のブログで紹介していなかった部分

先ほどの処理でコントローラーは追加されたのですが、
今のままだと、そちらは参照されません。

新たに作成したコントローラーの処理も反映させるようにするには、
ルーティングに作成したコントローラーを追記する必要があります。

devise_for :users, controllers: { sessions: 'users/sessions' }

上記のように、追加したコントローラーの名前とパスを記述します。

私は、この手順を抜かしていた為、
挙動を変更することが出来ていませんでした・・・

3:controllerに追加したい処理を記述する

ルーティングへの記述が終われば、
いよいよコントローラーへ追加したい処理を記述します。

class RegistrationsController < Devise::RegistrationsController
  def create
    if verify_recaptcha
      super
    else
      self.resource = resource_class.new
      respond_with_navigational(resource) { render :new }
    end
  end
end

これで、createアクションが動いた時に、
recaptureのバリデーションも可能になりました。

総括

これを調べる為に、様々なサイトを見ましたが、
DeviseのGitHubに全て記述されていました・・・

github.com

本当に基本的なことではありますが、
改めて、リファレンスをチェックする重要性を思い知りました。

《今日の学習進捗》

チーム開発:11日目
ユーザー新規登録機能にて、ログイン時のバリデーションを設定する。
JavaScriptの記述が冗長になってしまった為、
リファクタリングを行う。

学習開始からの期間 :60日
今日までの合計時間:617h
今日までに到達すべき目標時間:548h
目標との解離:69h
「10,000時間」まで、

残り・・・「9383時間!」