4

Ruby on Railsサーバーと通信しようとしているクライアント側にjqueryコードがあります。現在、クライアント経由でログインを機能させようとしています。

ユーザーが送信ボタンをクリックしたときに実行される jquery コードを次に示します。

$.ajax({
        headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') },
        type:"POST",
        data: hash,
        url: 'http://0.0.0.0:3000/users/sign_in.json',
        success: function(data) { 
            alert('Success');
            alert(JSON.stringify(data));
        },
        error: function(data) { 
            alert('Failed!');
            alert(JSON.stringify(data));
        },
    });
});

Rails サーバーのログを監視したところ、"Completed 200 OK in 387ms" が表示されました。これは、サーバー プロセスが正常に完了し、応答がクライアントに返されたことを意味します。

ただし、成功関数の代わりにクライアントでは、エラー関数が実行され、私は取得します{"readyState":0,"responseText":"","status":0,"statusText":"error"}

これがコントローラーのコードです

def create
resource = User.find_by_email(params[:user][:email])
return invalid_login_attempt unless resource

if resource.valid_password?(params[:user][:password])
  sign_in(:user, resource)
  resource.ensure_authentication_token
  respond_to do |format|
    format.html { redirect_to user_courses_path(current_user), notice: 'You are logged in' }
    format.json { render :json=> { :auth_token=> current_user.authentication_token, :success=> true, :status=> :created }}
  end
  return
end
invalid_login_attempt

終わり

私はfirebugを使ってみましたが、POSTリクエストの応答タブで見ました

syntaxerror json.parse予期しないデータの終わり

これは、サーバーから送信された応答が適切なハッシュではなかったことを意味します。を使用して同じ投稿リクエストを実行してみました

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d ' {"user":{"email":"asdf@jjpt.com","password":"password"}}'  http://0.0.0.0:3000/users/sign_in

次の応答が得られます{"auth_token":"zk1dyduMAo283mxP5o1m","success":true,"status":"created"}

したがって、curl リクエストは機能しています。しかし、jquery リクエストは JSON.parse エラーを返しています。どうしてか分かりません。誰かが私を助けてくれませんか、少しイライラしています。

4

2 に答える 2

0

これは、成功関数によって消費されることを意図した json 文字列の中に http 応答コードを入れているためだと思います。jquery は http 応答コードを認識しないため、エラーを想定してエラーに戻ります。

次のように、メッセージ本文の外にステータス コードを含める必要があります。

render json: {authtoken: 'xyz', myotherstuff: 'abc'}, status: :created

私は同じ問題を抱えていましたが、これが私にとってはうまくいきました。

私もこれが本当に役に立ちました:http://www.codyfauser.com/2008/7/4/rails-http-status-code-to-symbol-mapping

どの http ステータス コードに対応するためにどの :symbol を使用するかを教えてくれます。

于 2013-12-13T19:27:09.243 に答える
0

わかりましたので、コントローラーコードがないと問題の原因を理解するのは困難ですが、考えられる解決策は次のとおりです。

あなたの行動の最後に、次のようなものを入れてください:

respond_to do |format|
  format.json { render json: 'Your message', status: :ok } # Don't use here .to_json!
end

また、クライアント側に追加できます: dataType: 'json' AND JSON.stringify(data) を実行する必要はありません。すでに正しくフォーマットされているため、dataを操作するだけで済みます。

これで問題は解決しますが、そうでない場合は、アクション コードを提供します。

于 2013-11-05T08:41:20.110 に答える