0

何らかの理由で、 $.ajax() が呼び出されていません。$("#login").submit() 関数を検出しています。そこにアラートがあり、それが呼び出されたためです。

ファイルをビルドする代わりに、 http://build.phonegap.comを使用してファイルをビルドしています。

私はこれがたくさん出てくるのを見ます。しかし、そこにある解決策はどれも私を助けませんでした。私はこのコードを持っています:

signin.js:

$(window).load(function() {


$('#login').submit(function(e){
    e.preventDefault();
    obj = $(this);
    un = $("input[name='user']").val();
    pass = $("input[name='pass']").val();
    $.ajax({
        url: https+"getUserDetails",
        data: {
            username: un,
            password: pass
        },
        dataType: "jsonp",
        crossDomain: true,
        type: "POST",
        jsonpCallback: "user",
        success: function(response, textStatus, jqXHR){
            if(response.exists){
                alert(response.access_token);
                window.localStorage.setItem("user", JSON.stringify({"name": response.name, "id": response.id, "token":response.access_token}, null));
                runController();
            }
            else{
                $("#er").show();
            }
        }
    });
    return false;
});

});

config.js:

addr = "domain.com"
api = "/api/v1/"
http = "http://"+addr+api
https = "https://"+addr+api

config.xml:

....
<access origin="*" subdomains="true" />

<feature name="http://api.phonegap.com/1.0/device" />
<feature name="http://api.phonegap.com/1.0/file" />
<feature name="http://api.phonegap.com/1.0/network" />

<preference name="phonegap-version" value="2.1.0" />
....

index.html:

<!DOCTYPE html>
<html>
<head>
    ....
    <title>Sign In</title>
    <script type="text/javascript" src="js/jquery-1.8.2.min.js"></script>
    <script type="text/javascript" src="js/controller.js"></script>
    <script type="text/javascript" src="cordova-2.2.0.js"></script>
    <script type="text/javascript" src="js/signin.js"></script>
    ....
</head>
<body>
    ....
    <form id="login" action="#">
        <h2 class="form-signin-heading">Please sign in</h2>
        <input type="text" class="input-block-level" placeholder="Email address" name="user">
        <input type="password" class="input-block-level" placeholder="Password" name="pass">
        <label class="checkbox">
          <input type="checkbox" value="remember-me"> Remember me
        </label>
        <button class="btn btn-large btn-primary" type="submit">Sign in</button>
      </form>
     ....       
    </body>
 </html>

更新 1

サーバーログに表示される内容は次のとおりです。

Started POST "/api/v1/getUserDetails" for .... at 2012-11-29 20:38:22 -0800
Processing by Api::V1::ApiController#user_details as JSON
Parameters: {"username"=>"user", "password"=>"[FILTERED]"}
WARNING: Can't verify CSRF token authenticity
Completed 406 Not Acceptable in 15ms (ActiveRecord: 2.9ms)

更新 2

API コントローラーで CSRF トークンを無効にしたのは、不要なためです。これは、phonegap で ajax 呼び出しを実行したときにサーバー ログに表示される内容です。

Started POST "/api/v1/getUserDetails" for .... at 2012-11-30 11:38:26 -0800
Processing by Api::V1::ApiController#user_details as JSON
Parameters: {"username"=>"user", "password"=>"[FILTERED]"}
Completed 406 Not Acceptable in 27ms (ActiveRecord: 0.4ms)

それでも 406 エラーが発生します。私が次に試すべきことは何ですか?

4

2 に答える 2

0

問題の原因がわかったので、406 をデバッグする必要があります。406 の意味を説明するリンクをいくつか示します。

http://www.checkupdown.com/status/E406.html

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

基本的に、HTTP 要求がヘッダーに沿って送信されていることを確認する必要があります。これは、クライアント (アプリ) が、サーバーが応答できるようにフォーマットされた応答を受け入れることを示しています。クライアントとサーバーの形式を一致させるには、クライアント側またはサーバー側の変更が必要になる場合があります。使用しているサーバーについては何も知りませんが、ここで述べたように、jquery を介して ajax リクエストの Accepts ヘッダーを変更できます

http://api.jquery.com/jQuery.ajaxSetup/

于 2012-11-30T19:51:02.947 に答える
0

このエラーを引き起こしたのは、Ruby on Rails 側でした。これはモバイルデバイスであるため、形式をモバイルに変更することを忘れていました。この問題を解決するために私がしなければならなかったことは、APIコントローラーでこれを行うことでした:

skip_before_filter :prepare_for_mobile

それは私の問題を解決しました。

于 2012-11-30T23:02:24.580 に答える