我正在使用devise
,并试图迫使用户登录。签名后,我想检查他的电子邮件是否在工人表中找到。如果存在,请将他重定向到: /workers
,否则将其重定向到 /tasksadmins
。
我尝试了:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :authenticate_user!
before_filter :is_worker
def is_worker
@email = current_user.email
tag = Worker.where(:email => @email)
if tag.nil?
redirect_to '/tasksadmins'
else
redirect_to '/workers'
end
end
end
但是我得到了:
undefined method `email' for nil:NilClass
update
我尝试了:
class ApplicationController < ActionController::Base
protect_from_forgery
before_filter :authenticate_user!
before_filter :is_worker
def is_worker
if user_signed_in?
@email = current_user.try(:email)
if @email && Worker.find_by_email(@email).nil?
redirect_to '/tasksadmins'
else
redirect_to '/workers'
end
else
redirect_to '/users/sign_in' # devise?
end
end
end
好吧,对不起...我刚刚注意到您已经更新了您的问题
#SessionsController
def after_sign_in_path_for(resource)
return request.env['omniauth.origin'] || session[:user_return_to] || root_path
end
#Your controller
before_filter :user_return_to
before_filter :authenticate_user!
before_filter :is_worker
def is_worker
@email = current_user.try(:email)
if @email && Worker.find_by_email(@email).nil?
redirect_to '/tasksadmins'
else
redirect_to '/workers'
end
end
private
def user_return_to
session[:user_return_to] = request.fullpath
end
的动态发现器.find_by_email 返回单个对象(首先匹配)或 nil 否则。
但是 .where()总是返回可以是空白*(空*)和的ar ::的关系, nil nil 。
* ar ::关系响应.blank?和.empty?将这些方法委派给了实际数组的集合。,因此代码:
tag = Worker.where(:email => @email)
if tag.nil?
将始终返回 false
如果用户未成功身份验证,则cuurent_user为nil。我假设您正在使用设计进行身份验证,我是否正确?
def is_worker
render :template => '/login' and return if current_user.nil?
@email = current_user.email
tag = Worker.where(:email => @email)
if tag.nil?
redirect_to '/tasksadmins'
else
redirect_to '/workers'
end
end