2017-01-04 1 views
0

레일에 루비에서 ajax를 처음 사용했습니다. 내가 원하는 것 : 사용자가 클래스 .link (외부 사이트, 예 : www.google.de)의 링크를 클릭하면 게시물 /보기의 rails 컨트롤러 # action에 데이터, 즉 $(this).attr('id')을 전송해야합니다. 이것은 잘 작동되고, 그럼에도 불구하고 나는 구문 오류가있어 (!) :레일 : 구문 오류 : 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

이 내가 dataType: "json"을 삭제하면 내 자산이 /가/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

빠른 답장을 보내 주셔서 감사합니다 :). 제안한대로 코드를 변경했으며 구문 오류가 사라졌습니다. 그러나 지금 내 레일 게시물 # 컨트롤러보기 작업 올바른 '게시물'더 이상 찾을 것 같지 않습니다. 거기에 뭔가를 바꿔야합니까 (제 질문에 레일 컨트롤러 # 동작 포함) 했습니까? 자바 스크립트 콘솔에서 오류 ** 오류를 찾을 수 없습니다 **. – OhDaeSu

+0

작업에 페이로드가 전달되는 레일 로그를 확인 했습니까? _ 또한 StackOverflow는 디버깅 도구가 아니므로 문제를 이해하려고하십시오. –

+0

내 레일 로그에 'Complete 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"); 
    } 
}); 
}); 
관련 문제