Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么我的自定义登录控制器返回200?_Ruby On Rails_Json_Devise - Fatal编程技术网

Ruby on rails 为什么我的自定义登录控制器返回200?

Ruby on rails 为什么我的自定义登录控制器返回200?,ruby-on-rails,json,devise,Ruby On Rails,Json,Devise,我要过去 {"email":"invalidemail@gibberish.com"} 作为参数 我得到了一个200的回复,回复为零。为什么我看不到401 当我运行第一个 User.where('email = ?', params[:email]).first 在控制台中查询,我得到零。我也尝试过使用密码,测试无效的密码。在控制台中,它失败了。但我在这里不断收到200的回复: def sign_in user = User.where('email = ?', para

我要过去

{"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
您应该改为使用返回不包含页面内容的
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
您应该改为使用返回不包含页面内容的
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

虽然@baldrick在本例中使用
head
是正确的,但您的问题是“为什么我看不到401?”,对此,答案是:因为您拥有
状态
,而不是
:状态
(一个符号)

这应该起作用:

render :json => user, :status => 401
作为旁注,一开始我觉得有点奇怪,当你输入
状态时,你没有得到
名称错误,因为你调用的方法(我认为)并不存在。但事实上,
状态
是在Rails的
ActionController::Base
中定义的,它在其中委托给默认的响应对象(
@\u response
):

因此,
status
计算为
@\u response.status
,它(最初至少)被设置为200(ok)

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


希望能把事情弄清楚

虽然@baldrick认为在这种情况下你应该使用
是正确的,但你的问题是“为什么我没有看到401?”,对此,答案是:因为你有
状态
而不是
:状态
(一个符号)

这应该起作用:

render :json => user, :status => 401
作为旁注,一开始我觉得有点奇怪,当你输入
状态时,你没有得到
名称错误,因为你调用的方法(我认为)并不存在。但事实上,
状态
是在Rails的
ActionController::Base
中定义的,它在其中委托给默认的响应对象(
@\u response
):

因此,
status
计算为
@\u response.status
,它(最初至少)被设置为200(ok)

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


希望能把事情弄清楚

这不应该是
:status
而不是
status
。。非常感谢。我应该睡觉了。请删除。愚蠢的拼写错误。这是一个拼写错误,但Rails没有引发错误的事实很有趣。我认为留下评论(和答案)是值得的。这不应该是
:status
,而不是
status
?…是的。。非常感谢。我应该睡觉了。请删除。愚蠢的拼写错误。这是一个拼写错误,但Rails没有引发错误的事实很有趣。我认为值得留下评论(和答案)。ARG。非常感谢。我昨天起床太久了。非常感谢。昨天我起床太久了。