2

레일 4.1.1과 루비 2.1.2p95를 사용하고 있습니다. 나는 HAML과 비슷한 HTML 템플릿 언어로서 Slim을 사용하고있다. 내 랙 서버로 Thin을 사용하고 있습니다.레일스는 "text/javascript"로 기본 설정됩니다. 눈에 거슬리지 않는 JavaScript 폼에 대한 응답으로 작성된 content type

전적으로 AJAX 응용 프로그램을 만들려고합니다. (제 요구 사항 중 하나는 페이지를 새로 고칠 필요가 없다는 것입니다). 나는 (이 예제의 목적을 위해) 같이 보이는 UsersController 액션이

= form_for(User.new, url: user_path, remote: true) do |f| 
    = f.label :username 
    = f.text_field :username, label: true 
    = f.label :password 
    = f.password_field :password, label: true 
    = f.label :password_confirmation 
    = f.password_field :password_confirmation, label: true 
    = f.submit 

:

문제

I는 다음과 같습니다 사용자 가입 페이지가

def create 
    render html: "PRETEND A USER WAS CREATED" 
    end 

나는 이처럼 보이는 응답 핸들러를 가지고있다. (이것은 중요하지 않다. 성공 핸들러가 f 오류 처리기가 수행합니다) :

$("#dynamic_body").on("ajax:success", "[data-remote]", function(event, data, status, xhr) { 
     $("#dynamic_body").empty(); 
     $("#dynamic_body").append(data); 
    }); 
    $("#dynamic_body").on("ajax:error", "[data-remote]", function(event, xhr, status, error) { 
     $("#dynamic_body").empty(); 
     $("#dynamic_body").append(error); 
    }); 

Rails는 Content-Type 헤더가 "text/javascript"로 설정된 응답을 보냅니다. 따라서 브라우저는 AJAX 응답의 성공 이벤트 대신 오류 이벤트를 발생시키는 JavaScript로 응답을 구문 분석하려고 시도합니다. , 어느 form_for 호출에서 요청 URL 형식을 지정하여 내가

내가 레일에 명시 됨으로써이 문제를 해결할 수 있습니다 싫어

솔루션 :

= form_for(User.new, url: user_path(format: :html), remote: true) do |f| 
    ... 

또는 지정하여 컨트롤러 동작의 명시 적 헤더 :

def create 
    render html: "PRETEND A USER WAS CREATED", content_type: :html 
end 

그러나 나는이 작업을해야한다는 사실에 너무 화가났습니다. 아무도 레일스에 자바 스크립트 응답을 보내달라고 요청하지 않았습니다. Their own documentation says that the controller defaults to "text/html", 이는 분명히 대부분의 경우에 해당하지만 눈에 잘 띄지 않는 자바 스크립트 도구를 사용할 때는 그렇지 않습니다.

여기에서 무슨 일이 벌어지고 있는지 이해하고 싶습니다. 응용 프로그램을 구성 할 수있는 방법이 있으면 이러한 추가 해결 방법을 쓸 필요가 없습니다.

미리 감사드립니다.

+0

이것은 Chrome에서 특히 문제가되는 것으로 보입니다. 나는이 두통이 파이어 폭스와 관련이 없다.각 브라우저에서 네트워크 프로파일 러를 사용하여 Chrome은 응답을 'text/javascript'로 처리하여 Firefox를 'html'로 처리하고 문제가없는 것으로 판단합니다. 그러나 원인을 알 수 없습니다. 지난 몇 시간 동안 jquery와 jquery-ujs 파일을 훑어 보았고 아무 것도 생각 나지 않았습니다. JS에서 요청 헤더를 변경하거나 Rails 애플리케이션에서 응답 헤더를 변경하면 아무런 효과가없는 것으로 보입니다. 또한 문제는 간헐적입니다. – APotato

+0

신경 쓰지 마십시오. 그 코멘트를 게시하자마자, 나는 다시 일하기 시작하고 Chrome에서 작동하며 Firefox에서는 작동하지 않습니다. – APotato

답변

0

좋아,이 부분이 설명 할 수 없을 정도로 간헐적이라고 생각할 때 부분적으로 캐싱 문제라고 생각 했어야합니다. 기본적으로 Rails가 요청을 HTML 요청으로 처리하도록 강요하지만, 브라우저가 응답을 자바 스크립트로 캐시 한 경우 브라우저 캐시를 지우기 전까지는 응답이 작동하지 않습니다.

나는 내와 ApplicationController에 다음 코드를 추가 :

class ApplicationController < ActionController::Base 
    ... 

    # These two filters together should ensure we return HTML responses to the browser's AJAX reqeusts. 
    before_filter :prevent_caching 
    before_filter :default_request_format_html 

    ... 

    private 

    ... 

    def prevent_caching 
    expires_now 
    end 

    def default_request_format_html 
    request.format = "html" 
    end 
end 

이 (예를 들어 조건부 요청 형식을 강제로) 당신의 요구에 더 똑똑 할 수있는 최소한의 양식이다. default_request_format_html 콜백이 더 중요합니다. 처음부터 올바른 것이면 이론적으로는 캐시 무효화 콜백이 필요하지 않습니다.