Search code examples
ruby-on-railsdeviseroutes

Rails: Devise login route conflicting with sessions resources


I having an issue logging in after a successful signup using Devise with rails.

I get this error.

No route matches [POST] "/sessions/user"

I'm not sure why. I have a model named 'session' could this be why?

Here is the view-

<ul class="nav pull-right">
        <% if user_signed_in? %>
          <li><%= link_to current_user.full_name, edit_user_registration_path %></li>
          <li><%= link_to "log out", destroy_user_session_path, method: :delete %></li>
        <% else %>
          <li><%= link_to "Register", new_user_registration_path %></li>
          <li><%= link_to "Log in", new_user_session_path %></li>
        <% end %>
</ul>

And here is the output from 'rake routes'

 new_user_session GET    /users/sign_in(.:format)       devise/sessions#new
        user_session POST   /users/sign_in(.:format)       devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format)      devise/sessions#destroy
       user_password POST   /users/password(.:format)      devise/passwords#create
   new_user_password GET    /users/password/new(.:format)  devise/passwords#new
  edit_user_password GET    /users/password/edit(.:format) devise/passwords#edit
                     PUT    /users/password(.:format)      devise/passwords#update
cancel_user_registration GET    /users/cancel(.:format)        devise/registrations#cancel
   user_registration POST   /users(.:format)               devise/registrations#create
 new_user_registration GET    /users/sign_up(.:format)       devise/registrations#new
edit_user_registration GET    /users/edit(.:format)          devise/registrations#edit
                     PUT    /users(.:format)               devise/registrations#update
                     DELETE /users(.:format)               devise/registrations#destroy
            sessions GET    /sessions(.:format)            sessions#index
                     POST   /sessions(.:format)            sessions#create
         new_session GET    /sessions/new(.:format)        sessions#new
        edit_session GET    /sessions/:id/edit(.:format)   sessions#edit
             session GET    /sessions/:id(.:format)        sessions#show
                     PUT    /sessions/:id(.:format)        sessions#update
                     DELETE /sessions/:id(.:format)        sessions#destroy
                root        /                              sessions#index

I've searched around but haven't found any duplicates, If you catch something here please let me know. Thanks for your help on this.

The sign in page-

<div class="row">
<div class="span4">
  <%= simple_form_for(resource, :as => resource_name, :url => session_path(resource_name),     html: {class: "well"} ) do |f| %>

  <fieldset>
    <legend>Sign in</legend>

      <%= f.input :email %>
      <%= f.input :password %>

    <% if devise_mapping.rememberable? -%>
      <div><%= f.input :remember_me, as: :boolean %> </div>
    <% end -%>

    <div><%= f.button :submit, "Sign in" %></div>
  </fieldset>  
  <% end %>

  <%= render "devise/shared/links" %>
  </div>

  <div class="span8">
    <h2>Signing in is easy and secure!</h2>
  </div>
</div>

Solution

  • Ok, Devise defines a method session_path which is conflicting with your own routes: https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/url_helpers.rb#L9

    You'll need to either rename your Session model or provide a different name when you specify the routes for your Session model. Something like:

    # routes.rb
    resources :sessions, as: :logins