10

:remote=>trueでAJAX経由でフォームを送信するフォームがあります。サーバーログとFireBugを見ると、応答200 OKが返され、次の形式でJSONが返されます。

{ "email": "test@test.com"}

次に、これら2つのハンドラーがあります。

$('#new_invitation').bind("ajax:success", function(event, data, status, xhr) {
    alert('test');
});

$('#new_invitation').bind("ajax:error", function() {
    alert('error');
});

そして、200OKを取り戻したとしても、起動するのはエラーハンドラです。サクセスハンドラーを機能させることができたのは、ヘッダーに200を含む空の応答を送信したときだけでした。

これが機能しない理由がわかりません:-S

編集1------------これらの変更を行った後:

$('#new_invitation').bind("ajaxSuccess", function(event, data, status, xhr) {
    alert('test');
});

$('#new_invitation').bind("ajaxError", function(jqXHR, textStatus, errorThrown) {
alert('error');
    console.log(jqXHR.responseText);
    console.log(textStatus.responseText);
    console.log(errorThrown.responseText);
});

それでも同じエラーが発生します。ログのものは私に与えます:

undefined
my_email@test.com
undefined

フォームのコードは次のとおりです(標準のRailsのもの)。

<%= form_for @shoot.invitations.new, :url=>shoot_invitations_path(@shoot), :remote => true, :html => {:class => 'form-inline'} do |f| %>
    <%= f.text_field :email, :'placeholder' => 'ex: test@test.com' %>
    <%= f.text_field :role, :'placeholder' => 'ex: Photographer' %>
    <%= f.submit "Invite", :class => 'btn btn-success' %>
<% end %>

編集2---------

いくつか変更を加えましたが、エラーは解析エラーのようです。これはサーバーから返されるJSON(data.responseText)であるため、理解できません。これはすべて問題ないようです。

{"email":"zxxczxc@test.com"}

回答---------フォームオプションに:'data-type' =>:jsonを入力すると、すべてが機能するようになりました。以前にこれを試しましたが、htmlオプションではなくform_tagオプションに入れたため、機能しませんでした...

4

5 に答える 5

18

サーバーが有効な JSON ではないもの (単一のスペースなど) を返した場合、jQuery は解析エラーを生成し、ステータス コードが 200 であっても失敗した要求と見なします。

jQuery 1.9 の時点では、型が JSON に設定されている場合、空の文字列は無効な JSON であるため、完全に空の応答は失敗した要求と見なされます。http://jquery.com/upgrade-guide/1.9/#jquery-ajax-returning-a-json-result-of-an-empty-stringを参照してください。

于 2013-01-08T22:44:23.407 に答える
8
  1. $.ajax のデータ型が jsonp に設定されていることを確認します

  2. {email:"ahsgah@ahsgh.com"} に返信してみてください

于 2012-06-01T00:56:54.473 に答える
2

JSON.parse('') はエラーをスローします。私には、それはばかげています。未定義を返す必要があります。このコードをアプリに追加しました

#HACK JSON.parse('') should return undefined, not throw an error
_parse = JSON.parse
JSON.parse = (str) =>
  unless str == ''
    _parse.apply JSON, arguments

または、コーヒースクリプトを使用していない貧しい人々のために(テストされていません)

//HACK JSON.parse('') should return undefined, not throw an error
var _parse = JSON.parse
JSON.parse = function(str) {
  if (str !== '')
    return _parse.apply(JSON, arguments);
  else
    return undefined;
}
于 2013-02-01T22:01:56.573 に答える
1

ajaxSuccessの代わりにajax:success、およびeventTypesajaxErrorの代わりに使用します。ajax:error

ここを参照してください: http://docs.jquery.com/Ajax_Events

于 2012-05-31T19:22:30.217 に答える