【问题标题】:Rails conditional unless not working as intendedRails 有条件的,除非没有按预期工作
【发布时间】:2012-08-07 00:35:34
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails conditional-statements


    【解决方案1】:

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

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

    这样可以吗?

    【讨论】:

    • 有效!但是由于某种原因,一旦它返回并针对同一段代码运行,它就不会设置@current_user,即使此时用户存在。但是谢谢,我没有意识到这一点(我猜我已经习惯了 PHP)。
    • 仔细检查 session[:cas_user]User.find_by_uid(session[:cas_user]) 是否是您认为的......其中一个必须为 nil 或可能包含错误的值
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 2013-09-15
      • 1970-01-01
      • 2021-10-19
      相关资源
      最近更新 更多