web-dev-qa-db-ja.com

Deviseコントローラーにどのようにアクセスしますか?

Deviseのコントローラーは自動的に生成されますか?どのようにしてそれらにアクセスしますか?

あなたが行うビューについては知っていますRails generate devise_views

39
katie

Deviseは内部コントローラーを使用します。これは、独自のコードでアクセスしてサブクラス化できます。それらはDeviseモジュールの下にあります。たとえば、RegistrationsControllerを拡張するには:

class MembershipsController < Devise::RegistrationsController
  # ...
end

あとは、コントローラーを使用するようにDeviseのルートを構成するだけです。

devise_for :members, :controllers => { :registrations => 'memberships' }
40
Matheus Moreira

これらのコントローラーを変更またはオーバーライドするためにこれらのコントローラーを表示するという前提の下で、Deviseはこれを簡単にするためにアプリでコントローラーを再作成するシンプルなジェネレーターを提供するようになりました。 ドキュメント に従って(これは最新のものになります):

1)スコープを必要とするジェネレーターを使用してカスタムコントローラーを作成します:

コンソール

Rails generate devise:controllers [scope]

usersをスコープとして指定すると、コントローラーはapp/controllers/users/に作成されます。セッションコントローラーは次のようになります。

class Users::SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  # def new
  #   super
  # end
  ...
end

2)このコントローラーを使用するようにルーターに指示します:

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

3)devise/sessionsからusers/sessionsにビューをコピーします。コントローラーが変更されたため、devise/sessionsにあるデフォルトのビューは使用されません。


4)最後に、目的のコントローラーアクションを変更または拡張します。

コントローラーアクションを完全にオーバーライドできます。

class Users::SessionsController < Devise::SessionsController
  def create
    # custom sign-in code
  end
end

または、単純に新しい動作を追加できます:

class Users::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end

これは、特定のアクション中にバックグラウンドジョブをトリガーしたり、イベントを記録したりするのに役立ちます。

Deviseはフラッシュメッセージを使用して、サインインが成功したか失敗したかをユーザーに知らせることに注意してください。 Deviseは、アプリケーションが必要に応じてflash[:notice]およびflash[:alert]を呼び出すことを期待しています。フラッシュハッシュ全体を印刷せず、特定のキーのみを印刷します。状況によっては、Deviseは:timedoutキーをフラッシュハッシュに追加しますが、これは表示用ではありません。ハッシュ全体を印刷する場合は、このキーをハッシュから削除します。

40
Erik Trautman

$ Rails generate devise:controllers SCOPE [options]

オプション:-c、[-controllers = one two three]

生成する特定のコントローラーを選択します(確認、パスワード、登録、セッション、ロック解除、omniauth_callbacks)

-cを使用して、上書きするコントローラーを指定します。コントローラーを指定しない場合、すべてのデバイスコントローラーが作成されます。例えば:

Railsはdevise:controllersユーザーを生成します-c = sessions

これにより、app/controllers/users/sessions_controller.rbに次のようなコントローラークラスが作成されます。

 class Users::ConfirmationsController < Devise::ConfirmationsController
    content...
 end
11
indb

以下はRails 5の場合

次のコマンドを使用して、Railsコントローラーを作成します。

Rails generate devise:controllers users

上記の生成されたコントローラーを変更した場合、次の行をroutes.rb

devise_for :users, controllers: {registrations:'user/registrations'}

Railsサーバーを再起動すると、変更が有効になります

カスタムコントローラーの動作を定義するには、

@ErikTrautmanの答えをご覧ください。

しかし、Deviseが内部で行っていることを理解しようとしている場合は、

ソースを検査する必要があります(具体的には、プロジェクトルートのapp/ディレクトリ)。 @MatheusMoreiraはGitHubのソースへのリンクを提供しますが、独自のテキストエディターでローカルに閲覧したい場合は、gem which deviseでDevise gemのインストール場所を見つけることができます。

たとえば、Devise::SessionsControllerを表示するには:

$ vim $(gem which devise | sed 's|\(.*\)\(/.*\)\{2\}|\1|')/app/controllers/devise/sessions_controller.rb

(または、gitリポジトリのクローンを作成し、その方法で突くだけでもかまいません。)

$ git clone https://github.com/plataformatec/devise
$ cd devise
$ vim app/controllers/devise/sessions_controller.rb
0
Ryan Lue