2013-08-29 16 views
6

Jestem na Rails 4.0.Rails 4, jak złapać ajax: zdarzenie powodzenia

jestem wysyłając wydarzenie jak to (uwaga: zdalne => true):

<%= button_to 'yes', {controller:'videos', action:'rate', id: video.hashed_id, yesno:'yes'}, {:remote=>true, :class=>"rate-btn yes-btn btn btn-default btn-sm"} %> 

Mój kontroler wygląda następująco:

def rate 
    video = Video.find_by(hashed_id: params[:id]) 
    action = params[:yesno] 
    puts video.hashed_id 
    puts action 

    respond_to do |format| 

     if (action=='yes') 
     new_rating = video.rating==1 ? 0 : 1 
     video.update(is_new:0, rating: new_rating) 
     format.html { redirect_to controller:'projects', action: show, id: video.project.hashed_id } 
     format.json { head :no_content } 
     format.js { render :nothing=>true } 

     end  

     if (action=='no') 
     new_rating = video.rating==-1 ? 0 : -1 
     video.update(is_new:0, rating: new_rating) 
     format.html { redirect_to controller:'projects', action: show, id: video.project.hashed_id } 
     format.json { head :no_content } 
     format.js { render :nothing=>true } 
     end 

    end 

    end 

mam niby to z winging format.json/format.html, ponieważ nie w pełni rozumiem, które z nich należy stosować z żądaniem AJAX.

Z widokiem (gdzie przycisk życie) mam to:

$(document).ready(function($) { 
     console.log('ready'); 
    $(document).ajaxSuccess(function(data) {alert(data);}) 
    $(document).ajaxError(function(data) {alert(data);}) 
    $('.rate-btn').closest('form').on('ajax:success', function() { 
     console.log('ajax:success!'); 
    }); 

    $('.button_to').bind("ajax:success", function() { 
    console.log('test'); 
    }); 

}); 

Po kliknięciu przycisku, mam ready w konsoli, ale bez względu na to, co robię, nie mogę dostać się do test pojawią się w konsoli. czego mi brakuje?

Aktualizacja:

Próbowałem kliknięcie przycisku podczas oglądania /log/development.log i to co widzę:

Started POST "/videos/rate/lq7lv3218c/yes" for 127.0.0.1 at 2013-08-29 17:14:59 -0400 
Processing by VideosController#rate as JS 
    Parameters: {"authenticity_token"=>"es4wPqFrxxxxxFsbHQR/gAzofDC+ZwYsiiJ7RAQZUHk=", "id"=>"lq7lv3218c", "yesno"=>"yes"} 
    [1m[36mVideo Load (0.3ms)[0m [1mSELECT `videos`.* FROM `videos` WHERE `videos`.`hashed_id` = 'lq7lv3218c' LIMIT 1[0m 
    [1m[35m (0.1ms)[0m BEGIN 
    [1m[36mSQL (0.3ms)[0m [1mUPDATE `videos` SET `rating` = 0, `updated_at` = '2013-08-29 21:14:59' WHERE `videos`.`id` = 18[0m 
    [1m[35m (0.3ms)[0m COMMIT 
    Rendered videos/rate.html.erb (0.0ms) 
Completed 200 OK in 7ms (Views: 2.0ms | ActiveRecord: 1.1ms) 

Jestem szyn n00b ale wygląda OK, aby mnie.

+0

Hm. Czego używa? Czy mogę skonfigurować go tak, aby używał jQuery? – emersonthis

+0

Wiążesz ajax: sukces na elemencie HTML odtwarzacza wideo, który nie jest przyciskiem, który "uruchomił" żądanie, wykonaj wiązanie na przycisku zamiast tego: – MrYoshiji

+0

Próbowałem tego i nadal nie działa: '\t $ ('. rate-btn'). bind ("ajax: success", function() { \t \t console.log ('test'); \t}); ' – emersonthis

Odpowiedz

7

Pomocnik button_to tworzy formularz wokół przycisku przesyłania. Formularz otrzymuje atrybut data-remote (patrz: http://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to). Tak więc, spróbowałbym tego:

$('.rate-btn').closest('form').on('ajax:success', function() { 
    console.log('ajax:success!') 
});  

Ponieważ jesteś na Rails 4.0, zgaduję, że jesteś w jQuery 1.9. Wiązanie się z wydarzeniami nieco się zmieniło. Więc może to być częścią tego, jeśli to działało wcześniej. Korzystanie z powiązania zdarzeń było preferowane w stosunku do wersji .bind() od wersji 1.7.

+0

Dzięki. Próbowałem oryginalnie z '.on', ale kiedy to nie zadziałało. Zaktualizowałem pytanie do wszystkich detektorów zdarzeń, których używam do debugowania. – emersonthis

+1

Pomoże to sprawdzić, co zostało zwrócone przez żądanie AJAX. Zwykle używam do tego konsoli firebug. Czy jesteś w stanie to zdobyć? Jest wysoce podejrzane, że dziennik pokazuje akcję renderującą plik '.html.erb' dla akcji (' Rendered videos/rate.html.erb'), gdy żądanie wyraźnie pojawiło się jako żądanie JS. – pdobb

+0

Poruszę się z Firebugiem. Czy przyczyną problemu .html.erb byłby fakt, że utworzyłem plik /view/videos/rate.html.erb? Zrobiłem to na wszelki wypadek (CakePHP tego wymaga), ale nie sądziłem, że mogłoby to cokolwiek zranić. – emersonthis

0

Oto, co rozwiązało problem dla mnie:

  1. ja ładuje własne jQuery w układzie (tak: <%= javascript_include_tag "jquery-1.10.2.min", "data-turbolinks-track" => true %> Nie rzucał jakieś błędy, ale widocznie Szyny również ładowanie własną jQuery i były one w jakiś sposób sprzeczne, ponieważ po usunięciu kopalni cały jQuery nadal działał i natychmiast mogłem wywołać zdarzenia błędu AJAX w widoku, ale wciąż otrzymywałem błędy ajaxowe ...

  2. Zawsze miałem/plik views/videos/rate.html.erb w miejscu tylko dlatego, że nie byłem pewien, czy było to konieczne, czy nie (w CakePHP jest to) ALE I nie miałam w sobie nic z. To było puste. Nie jestem pewien dlaczego, ale kiedy dodałem 1 w tym pliku widoku, nagle zacząłem uruchamiać zdarzenia ajax: success.

Nie rozumiem dlaczegoto rozwiązać mój problem, więc jeśli ktoś może to wyjaśnić Chciałbym lepiej zrozumieć.

+0

Wygląda na to, że masz klejnot, który ładuje jQuery. (Czy masz na przykład klejnot typu "jquery-rails"?) Niestety, tak właśnie jest z Railsami, ale nie jestem pewien, czy jest idealny. Ale to już inny temat. Nie jestem pewien, dlaczego posiadanie zawartości w pliku widoku zmieniłoby odpowiedź lub w jaki sposób wpłynęłoby to na zdarzenia ... Ale wciąż myślę, że powinieneś wymyślić, jak zapewnić, że otrzymujesz właściwy format odpowiadający na twoje żądanie. – pdobb

+0

Polecam usunięcie szablonów (wyświetlanie plików) i sformatowanie respondentów, których nie zamierzasz używać/które mają wyraźną potrzebę. – pdobb

+0

Urgh. Nadal się z tym zmagam i jestem blisko, ale nadal nie mogę przenieść danych z kontrolera z powrotem do widoku. W kontrolerze mam 'format.json {render json: 'test'}' aw widoku mam '$ ('. Rate-btn') .bliżej (" formularz "). On (" ajax: success ", funkcja (e, dane, stan, xhr) { \t console.log (dane); \t}); "); Po kliknięciu przycisku otrzymuję 'null'. Nie rozumiem tego. – emersonthis

0

Sprawdź, czy masz błąd parsowania (lub podobne) przez przechwycenie ajax: zakończone. Sprawdź tam argument status. Możesz także ustawić punkt przerwania w jquery_ujs.js.

Powiązane problemy