Development Tip

jquery는 레일 표준 REST DELETE 응답에 대해 $ .ajax에서 성공 메서드를 호출하지 않습니다.

yourdevel 2020. 12. 25. 10:34
반응형

jquery는 레일 표준 REST DELETE 응답에 대해 $ .ajax에서 성공 메서드를 호출하지 않습니다.


그런 문제가 새로운 것은 아니지만 비슷한 것을 찾지 못했습니다. 그런 jQuery 코드가 있습니다.

$.ajax({ 
  url : ('/people/'+id), 
  type : 'DELETE', 
  dataType : 'json', 
  success : function(e) {
    table.getItems(currentPage);
  }
});

내 Rails 컨트롤러는 다음과 같습니다.

def destroy
    @person = Person.find(params[:id])
    @person.destroy

    respond_to do |format|
      format.html { redirect_to(people_url) }
      format.json  { render :json => @person, :status => :ok }
    end
end

이것은 효과가 있습니다.

그러나 다음을 사용할 때 (표준에 의해 생성됨) success콜백이 호출되지 않습니다.

def destroy
    @person = Person.find(params[:id])
    @person.destroy

    respond_to do |format|
      format.html { redirect_to(people_url) }
      format.json  { head :ok }
    end
end

아래 테스트 rails 3.0.3, jQuery 1.4.2Firefox 3.6.13.
Firebug는 쿼리가 실행되고 두 경우 모두 200 OK를 반환하며 두 경우 모두 항목도 삭제됩니다. 그러나 두 번째 경우에는 콜백이 호출되지 않습니다.

REST에 큰 차이가 있고 스캐 폴딩 컨트롤러를 사용하여 jQuery를 활용하는 방법이 있습니까?


나는 이것을 몇 번 보았고 대답은 믿을 수 없을 정도로 간단합니다.

dataType : 'json'$ .ajax 호출에서 사용 하고 있으므로 jQuery는 JSON 응답을 기대합니다. With head :okRails는 단일 공백 ​​( http://github.com/rails/rails/issues/1742 )이 포함 된 응답을 반환하며 이는 jQuery에서 유효한 JSON으로 허용되지 않습니다.

따라서 실제로 오류 또는 베어 200 OK 헤더를 얻을 것으로 예상하는 경우 dataType : 'html'요청에 설정 하면 작동합니다 (dataType을 설정하지 않으면 jQuery는 응답 헤더를 기반으로 유형이 무엇인지 추측하려고 시도합니다. 등, 여전히 json을 추측 할 수 있습니다.이 경우 여전히이 문제가 발생합니다.) 실제로 JSON을 반환하려면 JSON으로 head :ok유효한 것을 렌더링하거나 (주석 참조) head :no_content@Waseem이 제안한대로 사용하십시오.


GearHead는 정확하지만 jQuery 파서가 실제로 빈 문자열 응답을 null로 처리하고 구문 분석을 시도하지 않을만큼 똑똑하다는 점을 제외하면 정확합니다.

그러나 때때로 json을 수신하고 때때로 head응답을 수신하는 호출이 있고 서버에 액세스 할 수 없거나 모든 head호출 을 변경하고 싶지 않은 경우 다음 대체 솔루션을 수행 할 수 있습니다.

문제는 Rails가 사용할 때 빈 응답으로 단일 공백을 전송한다는 것입니다 head(여기 참조 : 레일에서 실제로 빈 본문을 반환하는 방법? ie content-length 0 ).

jQuery parseJSON 함수의 관련 부분은이 글을 쓰는 시점에서 다음과 같습니다.

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

As you can see, jQuery is testing whether the data is an empty string before trimming it. It then tries to JSON.parse("") which you can see in your console results in an error, triggering the ajax error callback via a catch statement.

There is a simple fix. jQuery allows you to use converters when one data type is requested and a different one is returned. See here for more details: http://api.jquery.com/extending-ajax/

Since the rails head response renders as text, you can simply define a text to json converter that will trim the response prior to attempting to parse it. Just add this snippet:

// deal with rails ' ' empty response
jQuery.ajaxSetup({
  converters: {
    "text json": function (response) {
      jQuery.parseJSON($.trim(response))
    }
  }
})

This is sometimes caused by an old version of the jQuery Validate Plugin. If you are using this plugin, this sometimes leads to this issue. There is an update that fixes this, if it applies to your case.

Alternatively, you can probably figure out what's going wrong by setting up an error handler via:

$.ajaxSetup() or $.ajaxError()

This will probably return a parse error. The newer versions of jQuery are notorious for being very strict with regards to JSON parsing.

ReferenceURL : https://stackoverflow.com/questions/4791499/jquery-doesnt-call-success-method-on-ajax-for-rails-standard-rest-delete-answ

반응형