0

我正在通过

{"email":"invalidemail@gibberish.com"}

作为参数。

我得到了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
4

2 回答 2

5

尽管@baldrick 在这种情况下应该使用是正确的,但head您的问题是“为什么我看不到 401?”,对此的答案是:因为您有status而不是:status(符号)。

这应该有效:

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

作为旁注,起初对我来说有点奇怪,当你 put 时status你没有得到 aNameError因为你正在调用一个(我认为)不存在的方法。但实际上status是在 Rails 中定义的ActionController::Base,在RackDelegation模块中,它委托给默认响应对象 ( @_response):

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

所以status评估为@_response.status,它(至少最初)设置为 200(ok)。

因此,render :json => user, status => 401等价于render :json => user, 200 => 401。只是被忽略了,200 => 401因为它与任何定义的选项都不匹配,并且您会得到 200 响应代码而不是预期的 401。

希望这能说明问题!

于 2013-01-25T14:39:43.327 回答
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
于 2013-01-25T14:36:03.537 回答