【結論】
・deviseが既定しているcontrollerの挙動を
変更するには、下記の手順が必要
・devise用のcontrollerを作成する
・作成したcontrollerをルーティングに追記する
・controllerに追加したい処理を記述する
・gemの仕様については、GitHubに細かく記載されているので、
使用方法について分からないことがあれば、
まずそちらを参照すべき
【目次】
- 疑問→deviseが既定しているcontrollerの動きを変えるのはどうすれば良いか?
- 1:devise用のcontrollerを作成する
- 2:ルーティングに作成したcontrollerを追記する
- 3:controllerに追加したい処理を記述する
- 総括
- 《今日の学習進捗》
【本題】
疑問→deviseが既定しているcontrollerの動きを変えるのはどうすれば良いか?
先日、reCAPTCHAを導入する方法をブログで取り上げましたが、
これの通りにやっても上手く行きませんでした(汗)
具体的に言うと、reCAPTCHAの判定結果を、
新たに作成した「registrations_controller」で取得しようとしても、
そちらに処理が飛ばず、reCAPTCHAの判定関係なく、
ログインが出来てしまう状態でした。
deviseの挙動を上手く変えられていない事が原因だと
考えられるので、改めて挙動を変える方法を調べました。
1:devise用のcontrollerを作成する
※既に、deviseの導入と、モデルは作成済みである前提で説明します。
deviseは、新規登録(registrations)やログイン(sessions)など、
アカウント認証の各機能毎にコントローラーを内部で作成しています。
なので、挙動を変える場合、
それらのコントローラーのクラスを継承した
コントローラーを新たに作成する必要があります。
下記のコマンドをターミナルで実行すると、
deviseが内部で作成しているコントローラーのクラスを
継承したコントローラーが一式生成されます。
「rails g devise:controllers users」 ※usersの部分はモデル名に準じる
そして生成されるファイルが下記の通りです。
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に全て記述されていました・・・
本当に基本的なことではありますが、
改めて、リファレンスをチェックする重要性を思い知りました。
《今日の学習進捗》
チーム開発:11日目
ユーザー新規登録機能にて、ログイン時のバリデーションを設定する。
JavaScriptの記述が冗長になってしまった為、
リファクタリングを行う。
学習開始からの期間 :60日
今日までの合計時間:617h
今日までに到達すべき目標時間:548h
目標との解離:69h
「10,000時間」まで、
残り・・・「9383時間!」