Reputation: 3289
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
Reputation: 7777
You can change the method
get
to delete
delete '/logout', to: 'sessions#destroy'
Upvotes: 1
Reputation: 2659
Try this,
delete '/logout', to: 'sessions#destroy'
and recheck your routes with
rake routes | grep logout
hope it's help
Upvotes: 2