2013-07-26 2 views
0

레일을 학습하고이를 강조하고 싶으므로이 방법을 "레일 방법"으로 사용하려고합니다.Forms in Rails 3.2 및 ajax 처리 요청 콜백

여기 내 "문제"입니다.

$('#subscribe-form') 
.on('ajax:beforeSend', function(){ 
    console.log('before send'); 
}) 
.on('ajax:success', function(){ 
    console.log('success'); 
}) 
.on('ajax:complete', function(){ 
    console.log('complete'); 
}) 
.on('ajax:error', function(){ 
    console.log('fail'); 
}) 

응용 프로그램 :

나는home.js에 home.html.erb

<%= form_tag( subscribe_newsletter_path , id:'subscribe-form', remote: true) do %> 
    <%= email_field(:subscription, :email, placeholder: 'ex: [email protected]') %> 
    <%= submit_tag("Subscribe Now!", class: 'btn btn-success') %> 
<% end %> 

내 자바 스크립트에서 다음과 같습니다 간단한 가입 양식을 가지고있다. js

//= require jquery 
//= require jquery_ujs 
//= require_tree . 

home_controller.rb 파일

response = //Response message from mailchimp API. looks like that {"error"=>"[email protected] is already subscribed to list Testing Rails. <a href=\"http://test.us6.list-manage1.com/subscribe/send-email?u=test&id=test&e=test==\">Click here to update your profile.</a>", "code"=>214} 

render json: response, status: '200' 

아약스 요청 해고 않고 내 컨트롤러는 이메일을 수신하고 메일 침프의 API로 전송 (나를 위해 까다로운 곳은) 다음과 같습니다 그런 다음 브라우저 (상태 200, Chrome dev 도구에서 json 응답을 볼 수 있음)로 다시 보내면 바인드 이벤트가 트리거되지 않습니다. $ (document)에 이벤트를 바인드 할 때 작업 중이라는 것을 알고 있습니다. $ ('# subscribe-form') 대신 잘 작동합니다 ...

왜?

+0

rails 3.2 및 rails.js ?? 확실합니까? rails.js는 내가 기억하는 레일 2.x의 구성 요소입니다. – rmagnum2002

+0

@ rmagnum2002 실제로 당신 말이 맞습니다. rails.js가 아닙니다. // application.js에 jquery_ujs가 필요합니다. 이것이 내가 의미하는 바입니다. 혼란에 죄송합니다. 질문을 수정하겠습니다.
Syl

답변

2

jQuery 1.7부터 .on() 메서드는 이벤트 처리기를 문서에 연결하는 데 선호되는 방법입니다. 이전 버전의 경우 .bind() 메서드는 이벤트 처리기를 요소에 직접 연결하는 데 사용됩니다. 핸들러는 의 jQuery 객체에서 현재 선택된 요소에 연결되므로 .bind() 호출이 발생하는 지점에 해당 요소가 있어야합니다. 보다 유연한 이벤트 바인딩을 위해서는 .on() 또는 .delegate()의 이벤트 위임에 대한 설명 을 참조하십시오.

더 :

$(document).ajaxSend(function() { 
    $("#loading").show(); 
}); 

$(document).ajaxComplete(function() { 
    $("#loading").hide(); 
}); 

그렇게 문제가 이용 될 수 있습니다 http://api.jquery.com/bind/

그것은 레일 3.2 응용 프로그램에서 나를 위해 일한 방법, 당신의 사건에 대한 정확하지 솔루션, exemples. 새로운 Jquery 버전을 사용하는 동안 바인딩하십시오.


ajaxComplete() 방법은 AJAX 요청이 완료 될 때 실행되도록하는 기능을 지정

편집.

참고 : 버전 1.8 jQuery를로,이 방법은 문서에 연결해야합니다.

ajaxSuccess()과 달리, ajaxComplete() 메서드로 지정된 함수는 요청이 완료되면 성공하지 못해도 실행됩니다.

+0

.on으로 시도한 경우에도 작동하지 않습니다. 그러나 모든 것 (.on 또는 .bind)은 $ (문서)에서 작동합니다. 그것은 단지 내 양식 요소 또는 제출 버튼에서 작동하지 않습니다. : – Syl

+0

$ ('subscribe-form')이 아닌 $ (document)에서 실행하고 싶습니다. 문제가 어디서 발생했는지 생각해 봅니다. – Syl

+1

look here http://www.w3schools.com/jquery /jquery_ref_ajax.asp, Jquery 1.8처럼 보이는 모든 아약스 메소드는 요소가 아닌 문서에 첨부되어야합니다 .. 어쨌든 저는 아약스와 jquery의 큰 전문가가 아닙니다 – rmagnum2002