2012-03-16 15 views
6

Używam Rails 3.1.1Nie można powiązać ajax: sukces tworzą stworzony z form_for ....: remote => true

Mam następujący w widoku haml:

= form_for booking.notes.build, :remote => true do |f| 
    = f.text_area(:content) 
    = f.hidden_field(:noteable_id) 
    = f.hidden_field(:noteable_type) 
    = f.submit('Add note') 

Który tworzy nowe notatki na temat składania. Również odpowiedź kontrolera pojawia się poprawnie w konsoli Chrome (karta Sieć). Ale wydaje mi się, że nie mogę złapać odpowiedzi.

Chcę zaktualizować listę notatek na stronie po przesłaniu. Próbowałem powiązać z odpowiedzią ajax, więc mogę pobrać odpowiedź, ale mi się nie udaje. Na przykład, myślę, że to powinno działać, ale nie:

$('#new_note').bind('ajax:success', function() { 
    alert('Hi'); 
}); 

Ale alarm nie jest uruchamiany. Co myślę wyjaśnia, dlaczego to również nie działa.

$('#new_note').bind("ajax:success", function(evt, data, status, xhr){ 
    // Insert response partial into page below the form. 
    $(this).parent.append(xhr.responseText); 

}) 

Czy możesz wskazać mi, co może być nie tak?

+0

Mam wokół tego za pomocą create.js.erb z kodem, który aktualizuje niezbędnego obiektu. Ale wolałbym móc pobrać wywołanie ajax, aby w razie potrzeby móc użyć obiektu błędu ajax. – ReggieB

Odpowiedz

0

ogół jest to zrobić wykonując plik w sekcji Widok kontrolera za create.js.erb (jeśli nie zostało to zrobione), w którym masz dostęp do tego, co zmienne pochodzą z działaniem tworzyć i tam można uczynić html

w pliku create.js.erb można napisać coś podobnego

$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>'); 

czytaj więcej w this post pisałem jakiś czas temu, to całkiem dużo wyjaśnia całkowity przepływ

+4

Jest dyskusyjne, że jest to "ogólnie zrobione". Osobiście uważam, że jest to zła praktyka, która sprawia, że ​​twój kod nie daje się utrzymać. JS powinien przejść do folderu zasobów, do którego należy. – egze

+0

to nie ma nic wspólnego z zasobami, jest to sposób obsługi javascript domyślnie w Railsach –

+0

Wszystko, co mówię, to - tylko dlatego, że możesz zwrócić javascript od kontrolera - nie oznacza to, że jest to najlepsze rozwiązanie. Mam wrażenie smaku i nie podoba mi się to podejście. – egze

8

Czy wypróbowałeś "ajax: complete"?

Inne rzeczy, które mogą pójść źle tutaj:

Kod stanu nie było „sukces”. To powoduje sukces w jQuery

if (status >= 200 && status < 300 || status === 304) { 

Lub procedura obsługi zdarzenia została oceniona przed wyrenderowaniem formularza. Spróbuj delegacji zdarzeń: (. Ostrożny, to jest nowa składnia jQuery Jeśli używasz starego jQuery, dostosuj odpowiednio)

$("body").on('ajax:success', '#new_note', function(){...}) 

+0

Od wersji jQuery 1.8, metoda .ajaxSuccess() powinna być dołączana tylko do dokumentu. – Ziggy

+1

To nie jest ajaxSuccess(). Railsy wciąż wyzwalają zdarzenie ajax: success na elemencie z danymi-remote = 'true'. – egze

+0

To są rzeczy "UJS", prawda? Przepraszam! Twoja odpowiedź jest dobra. – Ziggy

1

jeśli chcesz, możesz umieścić JavaScript w create.js.erb (kod w tym pliku zostaną wykonane po odpowiedzi przyjdzie do przeglądarki) I w tym pliku można użyć, jeśli oświadczenie, jak

<% if @ok %> 
    //your code 
<% end %> 

jeśli w akcji kontroler jest ustawiony na false @ok odpowiedź będzie pusta!