레일 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", 이는 분명히 대부분의 경우에 해당하지만 눈에 잘 띄지 않는 자바 스크립트 도구를 사용할 때는 그렇지 않습니다.
여기에서 무슨 일이 벌어지고 있는지 이해하고 싶습니다. 응용 프로그램을 구성 할 수있는 방법이 있으면 이러한 추가 해결 방법을 쓸 필요가 없습니다.
미리 감사드립니다.
이것은 Chrome에서 특히 문제가되는 것으로 보입니다. 나는이 두통이 파이어 폭스와 관련이 없다.각 브라우저에서 네트워크 프로파일 러를 사용하여 Chrome은 응답을 'text/javascript'로 처리하여 Firefox를 'html'로 처리하고 문제가없는 것으로 판단합니다. 그러나 원인을 알 수 없습니다. 지난 몇 시간 동안 jquery와 jquery-ujs 파일을 훑어 보았고 아무 것도 생각 나지 않았습니다. JS에서 요청 헤더를 변경하거나 Rails 애플리케이션에서 응답 헤더를 변경하면 아무런 효과가없는 것으로 보입니다. 또한 문제는 간헐적입니다. – APotato
신경 쓰지 마십시오. 그 코멘트를 게시하자마자, 나는 다시 일하기 시작하고 Chrome에서 작동하며 Firefox에서는 작동하지 않습니다. – APotato