0

通ります

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

パラメータとして。

200nil ボディで応答を取得しています。が表示されないのはなぜ401ですか?

最初に実行すると

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

コンソールでクエリを実行すると、nil が返されます。また、無効なパスワードをテストして、パスワードを試しました。コンソールでは、失敗します。しかし、私は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

補足として、最初は、(私が思っていた) 存在しないメソッドを呼び出しているため、配置したときにstatusが得られなかったのは少し奇妙でした。NameErrorしかし、実際statusには Rails の module で定義されActionController::BaseRackDelegationおり@_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定義されたオプションと一致しないため、単に無視され、予想される 401 ではなく 200 応答コードが返されます。

問題が解決することを願っています。

于 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 に答える