Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I override the PasswordsController actions in a rails app with ActiveAdmin & Devise

I have a rails app that is setup to use ActiveAdmin and Devise.

I want to override the edit and update actions in the PasswordsController. As far as I can tell, ActiveAdmin is relying on Devise's PasswordsController.

Do I need to use ActiveAdmin's method for customizing a controller / resource to do this? If so what resource is in play to "register" for the PasswordsController?

Or do I need to copy Devise's entire PasswordsController from the gem to somewhere in my app and change the actions I want to change? If so what folder would I put my copy of the Devise controller so it overrides the gem's version?

What is the correct way to do this?

like image 648
Streamline Avatar asked Feb 11 '14 21:02

Streamline


2 Answers

All of the devise-related code lives in lib/active_admin/devise.rb, including these controller definitions:

module ActiveAdmin
  module Devise

    class SessionsController < ::Devise::SessionsController
      include ::ActiveAdmin::Devise::Controller
    end

    class PasswordsController < ::Devise::PasswordsController
      include ::ActiveAdmin::Devise::Controller
    end

    class UnlocksController < ::Devise::UnlocksController
      include ::ActiveAdmin::Devise::Controller
    end

    class RegistrationsController < ::Devise::RegistrationsController
       include ::ActiveAdmin::Devise::Controller
    end

    class ConfirmationsController < ::Devise::ConfirmationsController
       include ::ActiveAdmin::Devise::Controller
    end

  end
end

You should be able to monkey-patch the PasswordsController to modify its behavior inside your app:

# config/initializers/active_admin_devise_sessions_controller.rb
class ActiveAdmin::Devise::PasswordsController

  # ...

end
like image 81
seanlinsley Avatar answered Oct 12 '22 03:10

seanlinsley


My approach, which you can apply to any of the ActiveAdmin::Devise controllers, was to update the ActiveAdmin::Devise.config right before setting it in devise_for in the routes file. I needed to do a before_action on the SessionsController

config/routes.rb

Rails.application.routes.draw do
  ActiveAdmin::Devise.config[:controllers][:sessions] = 'admin/sessions'

  devise_for :admin_users, ActiveAdmin::Devise.config
      
  # other routes
end

app/controllers/admin/sessions_controler

module Admin
  class SessionsController < ActiveAdmin::Devise::SessionsController
    before_action :authorize, except: [:new, :create]
  end
end

This works for me on a Rails 6 api only app.

like image 1
Luis Colón Avatar answered Oct 12 '22 04:10

Luis Colón