2011-05-27 3 views
10

Przechodzę przez Poradnik Railsowy Michaela Hartla i uderzę w mały szkopuł w punkcie 12.2.5, gdzie powinniśmy stworzyć działający przycisk z Ajaxem. Wiem, że kod jest poprawny (skończyłem kopiowanie go bezpośrednio z książki i trzykrotne przepisanie) i jestem zielony. Ale tak naprawdę nie działa!Przycisk nie aktualizuje się w Ajax - Rails Tutorial 3 w §12.2.5

W tej części samouczka zmieniamy przycisk wysyłania formularza regularnego do pracy z Ajax tak, że cała strona nie "odświeża się" (naprawdę, przekierowanie na tę samą stronę), a zamiast tego tylko przycisk i odpowiedni aktualizacja elementu paska bocznego. Problem polega na tym, że przycisk nie ładuje się automatycznie po kliknięciu, ponieważ oczekuję. Odświeża się po odświeżeniu strony. Jeśli wyłączę JS w mojej przeglądarce, powróci - tak jak powinien - do wersji HTML, która wyzwala przekierowanie i "odświeża" całą stronę. Jeśli zastanawiasz się, spróbowałem odświeżyć stronę i wypróbowałem Firefoksa, Safari i Chrome oraz Chrome w trybie incognito. Zamknąłem i zrestartowałem serwer szyny, spork i autotest. I przepisałem cały kod, a następnie skopiowałem cały kod książki. Wciąż byłam zakłopotana.

Mimo że test jest zielony, mam niedoskonale działającą funkcję. Może jest coś, czego mi brakuje i możesz mi pomóc je znaleźć? Może brakuje mi klejnot związane javascreipt-Ajax, klejnot ...

odpowiednich części kodu:

relationships_controller.erb:

class RelationshipsController < ApplicationController 
    before_filter :authenticate 

    def create 
@user = User.find(params[:relationship][:followed_id]) 
current_user.follow!(@user) 
respond_to do |format| 
    format.html { redirect_to @user } 
    format.js 
end 

koniec

def destroy 
@user = Relationship.find(params[:id]).followed 
current_user.unfollow!(@user) 
respond_to do |format| 
    format.html { redirect_to @user } 
    format.js 
end 
end 
end 

_follow.html.erb:

<% = form_for (current_user.relationships. kompilacja (: follow_id => @ user.id), : remote => true) do | f | %> <% = f.hidden_field: followed_id%>
<% = f.submit "Follow" %> <% end%>

_unfollow.html.erb:

<%= form_for(current_user.relationships.find_by_followed_id(@user), 
     :html => { :method => :delete }, 
     :remote => true) do |f| %> 

<% end%>

create.js.erb

$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>") 
$("followers").update('<%= "#{@user.followers.count} followers" %>') 

destroy.js.erb

$("follow_form").update("<%= escape_javascript(render('users/follow')) %>") 
$("followers").update('<%= "#{@user.followers.count} followers" %>') 

ja również upewnić się, że linia ta jest zawarta w application.html.erb

<%= javascript_include_tag :defaults %> 

Jeśli jest coś jeszcze jest potrzebne do oceny sytuacji , proszę pytać, a ja odpowiem aktualizacją.

TIA

Odpowiedz

0

Walczyłem z tym samym problemem. Nie mam jeszcze rozwiązania, ale pomyślałem, że będę mógł przesunąć piłkę do przodu z niektórymi próbami.

Najbardziej prawdopodobną przyczyną jest to. Próbując uprościć rzeczy, starałem się wyeliminować sam kod jQuery. Aby to zrobić, użyłem przeglądarki Safari Inspect Element/scripts, aby przetestować skrypty na stronie.

Postanowiłem iść z nieszkodliwe

$('title').text("Create") 

Wyrażając to jest konsola Safari zmienia tytuł. Umieszczenie go w moich plikach create.js.erb i my destroy.js.erb nie działa jednak (po kliknięciu przycisku follow/unfollow). Moje dzienniki pokazują, że wywoływany jest odpowiedni widok relations/destroy.js.erb, ale element nie jest odświeżany (a strona nie ładuje się ponownie).

Rendered layouts/_stylesheets.haml (3.3ms) 
Rendered layouts/_header.haml (6.1ms) 
Rendered layouts/_footer.haml (3.8ms) 
Rendered relationships/destroy.js.erb within layouts/application (34.8ms) 
Completed 200 OK in 132ms (Views: 39.0ms | ActiveRecord: 1.3ms) 

Jest to ostatnia rzecz do załadowania. Mój relationship_controller jest taki sam jak powyżej. Moje formularze są takie same jak w książce (ale w Haml), a ja zastąpiłem ten, który jest umieszczony na gałęzi hartl's github haml.

Przypuszczam, że pliki create.js.erb i destory.js.erb są ładowane, ale nie są wykonywane z jakiegoś powodu. Czy ktoś ma jakieś pomysły, co spróbować, aby zdiagnozować/rozwiązać to?

Dzięki,

Dave

+0

użyć narzędzia takiego jak Firebug (z firefox) lub narzędzi programistycznych dostarczanych z chromem, aby lepiej zrozumieć, co się dzieje. Na przykład, jeśli użyjesz chrome na komendzie mac-guit-opcji-i, aby wyświetlić narzędzia dla programistów. kliknij kartę "Konsola", a następnie spróbuj kliknąć, co uruchomi twój ajax. jeśli są błędy js, zobaczysz je tutaj. w przeszłości stwierdziłem, że moje żądania ajaxowe nie były poprawnie sformatowane, co powodowało błędy w js. szukałem problemów w szynach, ale problem był w samej odpowiedzi ajaxowej i przeglądarka go łapała, nie szyny (więc nie pojawiały się w moich dziennikach). – Dty

+0

Humbledaisy, czy byłeś w stanie go rozwiązać? Mam tutaj ten sam problem - wynik zwrócony z Railsów (który potwierdziłem za pomocą sniffera http) nie wyzwala zmiany, ale jeśli wkleisz kod do debuggera, to działa. Jestem zdziwiony. – chesterbr

1

I przy użyciu Rails 3.1.1 i miał ten sam problem po Rails 3.0 samouczek. W aktualizacji wersji Rails został przeniesiony z Prototype i zaczął używać jQuery. Aby poprawić starą wersję javascript, musiałem zaktualizować plik create/destroy.js.erb.

Możesz przeczytać o tym w chapter 13. Sprowadza się to do dodania "#" przed identyfikatorem tagu i zastąpienia wywołania ".update" przez ".html".

6

jakiej wersji szyny używasz? Jeśli jego 3.1 trzeba zmienić

create.js.erb do:

$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>") 
$("#followers").html('<%= "#{@user.followers.count} followers" %>') 

i destroy.js.erb do:

$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>") 
$("#followers").html('<%= "#{@user.followers.count} followers" %>') 

(Zauważ dodatkowy #) jego na ostatni rozdział samouczka, notatki dotyczące zmiany na szynę 3.1

0

Ive ostatnio miał ten problem z Railsami 4

uruchomić serwer WWW, kliknij na obserwacji/obserwować następnie wrócić do swoich dzienników WEBSERVER

patrzeć błąd

miałem błąd renderowania ID NIL

bo miałem zaktualizowane zmiennej @user w relationship_controller.erb na końcu kodu, ale nie na pierwszej linii, gdzie określił go

def tworzyć user = User.find (params [: followed_id]) current_user.follow (użytkownik) respond_to zrobić | Format | format.html {redirect_to @user} format.js końcowe koniec

utrwalono

def tworzyć @ user = User.find (params [: followed_id]) current_user.follow (@user) respond_to do | format | format.html {redirect_to @user} format.js końcowych koniec

sam raz dla zniszczyć - tak zaktualizować wszystkie instancje użytkownika z @user

okrzyki

Powiązane problemy