Reputation: 7121
I want to redirect by the role_ids
of the user:
workers_path
.tasksadmins_path
.I defined the next things:
class ApplicationController < ActionController::Base
include ApplicationHelper
protect_from_forgery
before_filter :authenticate_user!
def stored_location_for(user)
nil
end
def after_sign_in_path_for(user)
if current_user.role_ids == [2]
return redirect_to(workers_path)
else
return redirect_to (tasksadmins_path)
end
end
end
but when I sign in, I got errors:
AbstractController::DoubleRenderError in UserSessionsController#create
Render and/or redirect were called multiple times in this action. Please note
that you may only call render OR redirect, and at most once per action. Also
note that neither redirect nor render terminate execution of the action, so
if you want to exit an action after redirecting, you need to do something
like "redirect_to(...) and return".
Rails.root: /home/alon/alon/todolist
Application Trace | Framework Trace | Full Trace
app/controllers/user_sessions_controller.rb:5:in `create'
Request
Parameters:
{"utf8"=>"✓",
"authenticity_token"=>"jRNZkIXvToEhl9YVxaQoa2hLJiSaHI6JAdfpUNAQMJI=",
"user"=>{"email"=>"[email protected]",
"password"=>"[FILTERED]",
"remember_me"=>"0"},
"commit"=>"Sign in"}
This is my user_session_controller.rb
:
class UserSessionsController < Devise::SessionsController
include ApplicationHelper
def create
response = super
require "uri"
require "net/http"
## get the user id from the database
user_id = session['warden.user.user.key'][1][0];
## get the row by id
user = User.find(user_id)
# ============================
# Ensure that a user exists
# ============================
code, body = http_request(Net::HTTP::Put.new("/api/v1/users/external/#{user_id}"), email: user.email);
if code != 200
Rails.logger.error("Unable to register user #{current_user.email} at Licensario");
end
response
end
end
and this is my routes.rb
:
TODOLIST::Application.routes.draw do
devise_for :users, :controllers => { :sessions => 'user_sessions'} do
get '/users/sign_out' => 'devise/sessions#destroy'
end
resources :tasksadmins
resources :workers
root to: "workers#index"
end
Upvotes: 8
Views: 31483
Reputation: 28978
I faced this issue while using devise gem for my admin account management, but mine was on a production server.
AbstractController::DoubleRenderError (Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".):
The issue was that I wanted to sign_in into the admin dashboard, rather than entering the admin_dashboard URL into the browser, I put in the admin_sign_in URL in the browser, meanwhile, an admin account was already logged in. So when I tried to sign in it didn't work, because I can't sign-in 2 accounts at the same time to the admin dashboard.
Here's how I solved it:
That's all.
I hope this helps
Upvotes: 0
Reputation: 11967
You shouldn't return redirect_to
in the after_sign_in_path_for
. You should return url:
def after_sign_in_path_for(user)
if current_user.role_ids == [2]
return workers_url
else
return tasksadmins_url
end
end
Upvotes: 19
Reputation: 7121
I added to 'create' the next lines:
in the beginning, I wrote:
resource = warden.authenticate!(:scope => resource_name)
and then I wrote in the end of the 'create' function:
sign_in(resource_name, resource)
if current_user.role_ids == [2]
respond_with resource, :location => workers_path
else
respond_with resource, :location => tasksadmins_path
end
so my create looks so:
class UserSessionsController < Devise::SessionsController
include ApplicationHelper
def create
resource = warden.authenticate!(:scope => resource_name)
require "uri"
require "net/http"
## get the user id from the database
user_id = session['warden.user.user.key'][1][0];
## get the row by id
user = User.find(user_id)
# ============================
# Ensure that a user exists
# ============================
code, body = http_request(Net::HTTP::Put.new("/api/v1/users/external/#{user_id}"), email: user.email);
if code != 200
Rails.logger.error("Unable to register user #{current_user.email} at Licensario");
end
sign_in(resource_name, resource)
if current_user.role_ids == [2]
respond_with resource, :location => workers_path
else
respond_with resource, :location => tasksadmins_path
end
end
end
Upvotes: 1