2017-01-04 9 views
0

ruby​​ on railsでajaxを使用するのが初めてです。私が望むもの:ユーザがクラス.link(外部サイト、例えばwww.google.de)のリンクをクリックすると、データは - $(this).attr('id') - を投稿/表示のrailsコントローラ#actionに送信する必要があります。 (!)これは正常に動作している、それにもかかわらず、私は構文エラーを得た:私はdataType: "json"構文エラーが消滅を削除するとRails:構文エラー:JSON.parse:JSONデータの2行目の1列目に予期しない文字があります

parsererror SyntaxError: JSON.parse: unexpected character at line 2 column 1 of the JSON data
Stack-Trace: [email protected]http://localhost:3000/assets/jquery.self-660adc51e0224b731d29f575a6f1ec167ba08ad06ed5deca4f1e8654c135bf4c.js?body=1:9008:10
[email protected]http://localhost:3000/assets/jquery.self-660adc51e0224b731d29f575a6f1ec167ba08ad06ed5deca4f1e8654c135bf4c.js?body=1:9332:19
[email protected]http://localhost:3000/assets/jquery.self-660adc51e0224b731d29f575a6f1ec167ba08ad06ed5deca4f1e8654c135bf4c.js?body=1:9786:15
.send/[email protected]http://localhost:3000/assets/jquery.self-660adc51e0224b731d29f575a6f1ec167ba08ad06ed5deca4f1e8654c135bf4c.js?body=1:10303:8
fakeviews.self-2c717c6e0cc666118cfc1f98874e4c23dad3ccc9e219b4a857306ed44e947a7b.js:16:25

これは私の資産/ JavaScriptの/ views.js.erb

$(document).on("click", '.link', function() { 
    var id = $(this).attr('id'); 
    $.ajax({ 
     url: "/posts/view", 
     cache: false, 
     type: "GET", 
     dataType: "json", 
     data: { post_id: id }, // Here seems to be the problem? 
     complete: function() {}, 
     success: function(data, textStatus, xhr) { 
      alert("success"); 
     }, 
     error: function(jqXHR, textStatus, errorThrown) { 
      console.log(textStatus, errorThrown); 
      alert("error"); 
     } 
    }); 
}); 

です。だから、正確に何が起こっているのですか(私のコードは私が望むように動作しているので、なぜ構文エラーがあるのだろうかと疑問に思っています)。

これは私のコントローラ/ posts_controller.rbビューアクション

def view 
    @post = Post.find(params[:post_id]) 
    @post.views.create(user_id: current_user.id) 

    respond_to do |format| 
    format.html { redirect_to posts_path } 
    format.js {render json: @post } 
    end 
end 
+1

送信される応答は有効なJSONではありません。リクエストからresponseTextを含めるように質問を編集できますか? –

+1

'dataType'は、サーバーがあなたに送り返すことになっているデータ型を参照します。 – elementzero23

答えて

2

あなたが最初にJSONにあなたのオブジェクトをシリアル化するためにJSON.stringifyを使用して、あなたのサーバが、それはJSONです理解して、コンテンツタイプを指定する必要があります。

$.ajax({ 
      url: "/posts/view", 
      type: "POST", 
     dataType: "json", 
     headers: { 
      'Content-Type': "application/json" 
     }, 
     data: JSON.stringify({ post_id: id }), 

有効なJSON文字列ではないため、Railsは渡されたデータを認識できないため、解析中に構文エラーが発生します。

  • contentType要求
  • dataTypeサーバに送信 などの部分がクライアント(ブラウザ)によって受信されるデータの予想されるフォーマットを指定されているデータの形式を指定します。

また、方法をGETからPOSTに変更します。 GETリクエスト(少なくとも通常は)にはメッセージ本文がありません。 GETに設定すると、URL文字列のパラメータに変換されます。

+0

あなたのクイック返信ありがとう:)。あなたが提案したとおりにコードを変更しました。構文エラーはなくなりました。しかし、今では、私のレールの投稿#view controllerアクションは正しいPostを見つけられないようです。私はそこで何かを変更する必要がありますか(私の質問には私のレールコントローラ#アクションを含めました)? Javascriptコンソールで、エラーが見つかりません**エラーが見つかりません**。 – OhDaeSu

+0

railsログをチェックしましたか?どのペイロードがアクションに渡されましたか? _Also StackOverflowはデバッグツールではありません。問題を理解してください。 –

+0

私のレールのログには、次のエラーが表示されます。'Completed 404 Not Found 3ms(ActiveRecord:0.4ms) ActiveRecord :: RecordNotFound( 'ID' =)のFostを見つけることができませんでした: ' – OhDaeSu

1

dataは有効なJSON文字列である必要があります。有効かどうかはby pasting it hereです。あなたのケースで有効なJSON文字列を取得するには、JSON.stringify(JavaScriptObject)を使用してください:

$(document).on("click", '.link', function() { 

var id = $(this).attr('id'); 
var dataObject = {}; 
dataObject.post_id = id; 
$.ajax({ 
    url: "/posts/view", 
    cache: false, 
    type: "GET", 
    dataType: "json", 
    data: JSON.stringify(dataObject) 
    complete: function() {}, 
    success: function(data, textStatus, xhr) { 
     alert("success"); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     console.log(textStatus, errorThrown); 
     alert("error"); 
    } 
}); 
}); 
関連する問題