Search code examples
ruby-on-rails-4authlogic

Can't route to /logout with Authlogic


I've been trying to set up user authentication in my app using Authlogic, and I'm sure the problem is in my code but I can't seem to find it. When I hit the /login link, all works as expected, but my /logout wants to use GET instead of DELETE.

routing.db

Rails.application.routes.draw do

  root 'comments#index'

  resources :roles
  resources :subjects
  resources :comments
  resources :topics
  resources :users
  resources :user_sessions, only: [:create, :destroy]

  delete '/logout', to: 'user_sessions#destroy', as: :logout
  get '/login', to: 'user_sessions#new', as: :login
end

user_sessions_controller

class UserSessionsController < ApplicationController

  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(user_session_params)
    if @user_session.save
        flash[:success] = "Welcome back!"
        redirect_to root_path
    else
        render :action => :new
    end
  end

  def destroy
    current_user_session.destroy
    flash[:success] = "Goodbye!"
    redirect_to root_path
  end

  private

  def user_session_params
    params.require(:user_session).permit(:username, :password, :remember_me)
  end
end

application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= content_for?(:title) ? yield(:title) : "Untitled" %></title>
    <%= stylesheet_link_tag "application" %>
    <%= javascript_include_tag :defaults %>
    <%= csrf_meta_tag %>
    <%= yield(:head) %>
  </head>
  <body>
    <div id="user_nav">
        <% if current_user %>
            <span><%= current_user.username %></span>
            <%= link_to "Edit profile", edit_user_path(:current) %>
            <%= link_to 'Sign Out', logout_path, :method => :delete %>
        <% else %>
            <%= link_to "Register", new_user_path %>
            <%= link_to 'Sign In', login_path %>
        <% end %>
    </div>
    <div id="container">
      <% flash.each do |name, msg| %>
        <%= content_tag :div, msg, :id => "flash_#{name}" %>
      <% end %>
      <%= content_tag :h1, yield(:title) if show_title? %>
      <%= yield %>
    </div>
  </body>
</html>

Does anything here look wrong? Here's the error I'm getting:

Start of error page

Relevant routes on error page


Solution

  • In your application.html.erb file:

    Change:

    <%= javascript_include_tag :defaults %>
    

    To:

    <%= javascript_include_tag "application" %>
    

    It should work after that!