2013-01-25 40 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

相关问题