0

我有一个 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 else 语句,但我想知道我做错了什么。

if @current_user.present?
    @current_user.syncUserRoles
else
    redirect_to :login
end //This works as intended
4

2 回答 2

2

redirect_to 不会停止方法中的代码执行。调用 return 以确保您停止代码执行:

(redirect_to :login && return) unless @current_user = User.find_by_uid(session[:cas_user])

它像这样工作吗?

于 2012-08-06T16:33:56.273 回答
1

这里的困惑在于如何redirect_to工作,而不是unless. redirect_to只是设置一个302 Moved标题,它不会从您的操作中返回。所以下一行仍然会执行(你的@current_user.syncUserRoles行),当它渲染时,它会设置 302 状态代码。

正如您所发现的,将它放在一个单独的else分支中是避免执行该行的一种方法。

于 2012-08-06T16:35:34.020 回答