2013-01-25 78 views
0

我傳遞爲什麼我的自定義登錄控制器返回200?

{"email":"[email protected]"} 

的參數。

我得到一個200響應與一個零體。爲什麼我看不到401

當我在控制檯中運行的第一

User.where('email = ?', params[:email]).first 

查詢,我得到零。我也嘗試使用密碼,測試無效的密碼。在控制檯中,它失敗。不過,我一直在這裏得到一個200響應:

def sign_in  
    user = User.where('email = ?', params[:email]).first 
    if !user 
     render :json => user, status => 401 
     return 
    end 

    if user.valid_password?(params[:password]) 
     render :json => user 
     return 
    end 

    render :json => user, status => 401 
    end 
+3

不應該是':status'而不是'status'? –

+0

..謝謝。我應該去睡覺了。 – quantumpotato

+0

請刪除。愚蠢的錯字。 – quantumpotato

回答

1

您應該使用head,而不是在沒有網頁內容只返回401代碼:

def sign_in  
    user = User.where('email = ?', params[:email]).first 
    if user && user.valid_password?(params[:password]) 
     render :json => user 
    else 
     head :unauthorized # 401 
    end 
    end 
5

雖然@baldrick是正確的,你應該在這個使用head案例中,您的問題是「爲什麼我看不到401?」,對此,答案是:因爲您有status而不是:status(符號)。

這應該工作:

render :json => user, :status => 401 

作爲一個側面說明,這是一個有點奇怪我在第一,當你把status因爲你調用一個方法,你沒有得到NameError(我認爲)不存在。但實際上status在Rails的ActionController::Base被定義,在RackDelegation module,在那裏它委託給一個默認響應對象(@_response):

delegate :headers, :status=, :location=, :content_type=, 
     :status, :location, :content_type, :to => "@_response" 

所以status的計算結果爲@_response.status,這(至少最初)被設定爲200 (好)。因此,render :json => user, status => 401相當於render :json => user, 200 => 401200 => 401簡單地被忽略,因爲它不符合任何已定義的選項,並且您將得到200響應代碼,而不是預期的401.

希望能夠解決問題!

+0

ARG。謝謝。我昨天過得太久了。 – quantumpotato

相關問題