Search code examples
ruby-on-railsnamespacesruby-on-rails-pluginsdevise

Devise within namespace


I'm trying to split my rails project in a front-end for regular users and a back-end for admins. Therefore i have created a namespace 'admin' so that i can easily control admin specific controller methods/layouts/authentication in the map admin.

I'm using Devise to register/authenticate my admins only. Because it is only used for admins only i'm trying to move Devise to the admin namespace.

I could not find exactly what i was looking for in the documentation of Devise but i tried something like this in routes.rb:

namespace 'admin'do 
  devise_for :admins
end

I also tried to make a custom Devise::Sessions controller but that too didn't seem to work out.

Does anyone know how to do this? Should i just use the regular routes for devise with a custom(admin) layout?


Solution

  • Simply "moving" Devise to the admin namespace is wrong. Devise uses controllers like Devise::SessionsController and that cannot be "moved".

    I usually create my own controllers and inherit them from Devise:

    class Admin::SessionsController < ::Devise::SessionsController
      layout "admin"
      # the rest is inherited, so it should work
    end
    

    And configure this in config/routes.rb:

    devise_for :admins, :controllers => { :sessions => "admin/sessions" }
    

    Or you could change the layout only, by making the layout a bit more complex:

    class ApplicationController < ActionController::Base
    
      layout :layout
    
      private
    
      def layout
        if devise_controller? && devise_mapping.name == :admin
          "admin"
        else
          "application"
        end
      end
    
    end