Как вы получаете доступ к контроллерам Devise?

Созданы ли автоматические генераторы? Как вы к ним обращаетесь?

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

Ответ 1

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

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

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

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

Ответ 2

В предположении, что вы хотите видеть эти контроллеры для их изменения или переопределения, 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 к хэшу Flash, который не предназначен для отображения. Удалите этот ключ из хэша, если вы намереваетесь распечатать весь хэш.

Ответ 3

$ rails generate devise:controllers SCOPE [options]

Параметры: -c, [--controllers = один два три]

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

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

рельсы генерируют конструкцию: контроллеры users -c = сеансы

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

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

Ответ 4

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

см. ответ @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