2012-08-06 47 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