Search code examples
ruby-on-railsruby-on-rails-3devise

Setting Devise Login to be root page


I am using the following code for my routes:

devise_for :user, 
  :as => '', 
  :path_names => { 
    :sign_in => "", 
    :sign_out => "logout", 
    :sign_up => "register" 
  }

But when I'm logged out and I goto /logout I get the following error:

No route matches {:action=>"new", :controller=>"devise/sessions"}

How do I setup the root path to be to :sign_in action?


Solution

  • To follow on from the people who are asking about the error Could not find devise mapping for path "/" there is a workaround.

    You'll find that there is a clue in your logs which will probably say:

    [Devise] Could not find devise mapping for path "/".
    This may happen for two reasons:
    
    1) You forgot to wrap your route inside the scope block. For example:
    
      devise_scope :user do
        match "/some/route" => "some_devise_controller"
      end
    
    2) You are testing a Devise controller bypassing the router.
       If so, you can explicitly tell Devise which mapping to use:
    
       @request.env["devise.mapping"] = Devise.mappings[:user]
    

    So I retried the approach but instead wrapping it (as @miccet suggets) inside a scope block:

    devise_scope :user do
      root to: "devise/sessions#new"
    end
    

    This worked fine for me