Devise within namespace

Harm de Wit picture Harm de Wit · Dec 21, 2010 · Viewed 26.5k times · Source

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?

Answer

iain picture iain · Dec 21, 2010

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