2012-08-06 48 views
0

我有一个Rails应用程序,并在我的应用程序控制器,我有以下的代码不工作: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错误,我不得不最终诉诸于一个完全成熟的,如果出错了else声明,但我想知道我做错了什么。

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

回答

1

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

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

2

redirect_to不停止代码在方法中的执行。请致电退货以确保您停止执行代码:

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

它是否像这样工作?

+0

它的工作原理!然而,由于某种原因,一旦它返回并运行到同一段代码,它不会设置@current_user,即使此时用户将存在。但是,谢谢,我没有意识到这一点(我猜也习惯了PHP)。 – Oranges13 2012-08-06 16:44:53

+1

仔细检查'session [:cas_user]'和'User.find_by_uid(session [:cas_user])'是你认为它们是什么......其中一个必须是零或可能包含错误的值 – 2012-08-06 16:48:29