Как вы получаете доступ к контроллерам Devise? - PullRequest
39 голосов
/ 04 июня 2011

Контроллеры в разработке автоматически генерируются?Как вы получаете к ним доступ?

Я знаю, что вы делаете rails generate devise_views.

Ответы [ 5 ]

40 голосов
/ 04 августа 2015

Предполагая, что вы хотите видеть эти контроллеры, чтобы изменить или переопределить их, 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 голосов
/ 04 июня 2011

Devise использует внутренние контроллеры, к которым вы можете обращаться и создавать подклассы в своем собственном коде.Они находятся под модулем Devise.Например, чтобы расширить RegistrationsController:

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

Тогда все, что вам нужно сделать, это настроить маршруты Devise для использования вашего контроллера вместо:

devise_for :members, :controllers => { :registrations => 'memberships' }
11 голосов
/ 01 января 2016

$ rails generate devise:controllers SCOPE [options]

Опция: -c, [--controllers = один два три]

Выберите конкретные контроллеры для генерации (подтверждения, пароли, регистрации, сеансы, разблокировки, omniauth_callbacks)

Используйте -c, чтобы указать, какой контроллер вы хотите перезаписать. Если вы не укажете контроллер, будут созданы все разработанные контроллеры. Например:

rails генерируют устройство: пользователи контроллеров -c = сеансы

Это создаст класс контроллера в app / controllers / users / session_controller.rb следующим образом:

 class Users::ConfirmationsController < Devise::ConfirmationsController
    content...
 end
3 голосов
/ 17 января 2018

Ниже приведено описание для Rails 5

Генерируйте рельсы для разработки контроллеров с помощью следующей команды:

rails generate devise:controllers users

если вы изменили выше сгенерированные контроллеры, добавьте следующеелиния к routes.rb,

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

Ваши изменения вступят в силу после перезапуска сервера rails

0 голосов
/ 07 июня 2017

Чтобы определить пользовательское поведение контроллера,

см. Ответ @ ErikTrautman.

Но если вы пытаетесь понять, что Devise делает изнутри,

, вы должны проверить источник (в частности, в корневом каталоге проекта app/).@MatheusMoreira предоставляет ссылку на источник на GitHub, но если вы предпочитаете просматривать его локально в своем текстовом редакторе, вы можете найти место установки гема Devise с помощью gem which devise.

Например,чтобы увидеть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...