Rails是有条件的,除非没有按预期工作

时间:2012-08-06 16:31:00

标签: ruby-on-rails conditional-statements

我有一个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

2 个答案:

答案 0 :(得分:2)

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

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

它是否像这样工作?

答案 1 :(得分:1)

这里的混淆是redirect_to的工作原理,而不是unlessredirect_to只设置一个302 Moved标题,它不会从您的操作返回。所以下一行仍然会执行(你的@current_user.syncUserRoles行),当它渲染时,它将设置302状态代码。

如您所发现的那样,将它置于唯一的else分支中是避免执行该行的一种方法。