Charles Smith
Charles Smith

Reputation: 3289

Rails 5 route calling wrong controller on logout

I have a user authentication system that works for login, forgot password and change profile info, but my logout route is going wacky on me and gives me the error The action 'destroy' could not be found for PagesController. I don't know why its calling the PagesController. I have a namespaced PagesController for admin actions and a pages controller just for the show method. Like I said, everything works perfectly except for the session logout. Thank you.

routes

Rails.application.routes.draw do
  get 'password_resets/new'
  get 'password_resets/edit'
  get 'sessions/new'
  get '/signup', to: 'users#new'
  get '/login', to: 'sessions#new'
  post '/login', to: 'sessions#create'
  get '/logout', to: 'sessions#destroy'
  resources :users
  resources :account_activations, only: [:edit]
  resources :password_resets, only: [:new, :create, :edit, :update]
  get 'contact-me', to: 'messages#new', as: 'new_message'
  post 'contact-me', to: 'messages#create', as: 'create_message'
  resources :articles
  mount ImageUploader.upload_endpoint(:cache) => '/images/upload'
  mount StripeEvent::Engine, at: '/webhooks/stripe'

  namespace :admin do
    get '', to: 'dashboard#index', as: '/'
    resources :pages
    resources :articles
    resources :categories
    resources :tags
    resources :albums
    resources :banners
    resources :products do
      resources :variations
    end
  end

  resources :products do
    resources :variations
  end

  root 'pages#show', defaults: { id: 'home' } # shows home page as default from pages controller
  resources :pages, path: ''
end

logout link

<%= button_to 'Logout', logout_path, method: :delete %>

sessions_controller

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      if user.activated?
        log_in user
        params[:session][:remember_me] == '1' ? remember(user) : forget(user)
        redirect_back_or user
      else
        message  = "Account not activated. "
        message += "Check your email for the activation link."
        flash[:warning] = message
        redirect_to root_url
      end
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out if logged_in?
    redirect_to root_url
  end
end

sessions_helper

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Remembers a user in a persistent session.
  def remember(user)
    user.remember
    cookies.permanent.signed[:user_id] = user.id
    cookies.permanent[:remember_token] = user.remember_token
  end

  # Returns true if the given user is the current user.
  def current_user?(user)
    user == current_user
  end

  # Returns the user corresponding to the remember token cookie.
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end

  # Forgets a persistent session.
  def forget(user)
    user.forget
    cookies.delete(:user_id)
    cookies.delete(:remember_token)
  end

  # Logs out the current user.
  def log_out
    forget(current_user)
    session.delete(:user_id)
    @current_user = nil
  end

  # Redirects to stored location (or to the default).
  def redirect_back_or(default)
    redirect_to(session[:forwarding_url] || default)
    session.delete(:forwarding_url)
  end

  # Stores the URL trying to be accessed.
  def store_location
    session[:forwarding_url] = request.original_url if request.get?
  end

end

Upvotes: 0

Views: 179

Answers (2)

fool-dev
fool-dev

Reputation: 7777

You can change the method get to delete

delete '/logout', to: 'sessions#destroy'

Upvotes: 1

Hardik Upadhyay
Hardik Upadhyay

Reputation: 2659

Try this,

delete '/logout', to: 'sessions#destroy'

and recheck your routes with

rake routes | grep logout

hope it's help

Upvotes: 2

Related Questions