我有一个rails应用程序,在我的应用程序控制器中,我有以下代码:
redirect_to :login unless @current_user = User.find_by_uid(session[:cas_user])
@current_user.syncUserRoles
因此,除非成功找到用户帐户,否则应该将其重定向到登录状态。但是,即使@current_user返回nil,它仍然会进入下一行。 所以,我将代码修改为以下内容:
@current_user = User.find_by_uid(session[:cas_user])
redirect_to :login unless @current_user.present?
@current_user.syncUserRoles
但是,它会忽略内联,除非第2行出错并且第3行出现nilClass错误。我不得不求助于一个完整的if if语句,但我想知道我是什么做错了。
if @current_user.present?
@current_user.syncUserRoles
else
redirect_to :login
end //This works as intended
答案 0 :(得分:2)
redirect_to不会停止方法中的代码执行。调用return以确保停止代码执行:
(redirect_to :login && return) unless @current_user = User.find_by_uid(session[:cas_user])
它是否像这样工作?
答案 1 :(得分:1)
这里的混淆是redirect_to
的工作原理,而不是unless
。 redirect_to
只设置一个302 Moved
标题,它不会从您的操作返回。所以下一行仍然会执行(你的@current_user.syncUserRoles
行),当它渲染时,它将设置302状态代码。
如您所发现的那样,将它置于唯一的else
分支中是避免执行该行的一种方法。