Ich habe Probleme mit einer remote ausgeführten Aktion und eine partielle, die nicht das erste Mal aktualisiert, wenn ich auf den Link klicke.Teil nicht aktualisiert beim ersten Klick
Innerhalb der Ansicht (ein Teil namens books
) Ich verursache einen Link:
link_to "⊗", read_book_path(book), :remote => true
Die read_book_path
in definiert ist routes.rb Es gibt auch eine Bedingung, die einen anderen Text anzeigt, wenn das Buch gelesen .
In meinem Controller habe ich eine neue Aktion definiert:
def read
@books = Book.all
@book = Book.find(params[:id])
@book.read = [email protected]
@book.save
respond_to do |format|
format.html { redirect_to(books_url) }
format.js {render :layout => false, :locals => { :book => @book } }
end
end
Das bedeutet, brauche ich eine Datei read.js.erb
, Inhalte dieser Datei ist:
$("#books").empty().html("<%= escape_javascript(render(:partial => "books")) %>");
Wenn ich auf den Link klicken, kann ich Im Terminalfenster sehen Sie, dass das Datenbankfeld aktualisiert ist, aber das Teilfeld nicht. Wenn Sie erneut auf denselben Link klicken, wird der Teil aktualisiert.
Das Ändern der Verbindung zu :remote => false
funktioniert auch, aber die Seite wird neu geladen (wie erwartet).
Ich habe versucht, es mit Safari und den Entwicklertools zu debuggen, und ich kann die Antwort des Servers sehen, wenn ich den Link zum ersten Mal klicke. Da stimmt etwas nicht, der von <%= escape_javascript(render(:partial => "books")) %>
generierte HTML enthält den falschen HTML-Code mit dem alten Inhalt des Partiellen. Nur der zweite oder dritte Klick zeigt das aktualisierte HTML.
Ich habe jquery-ujs integriert - ist das der Grund, warum das Teil nicht das erste Mal aktualisiert oder fehlt mir etwas anderes?
Das gab mir wirklich Kopfschmerzen, können Sie mir helfen?
Edit: Wenn das hilft: Ich habe einen Listener in application.js zu ajax:before
und ajax:complete
erstellt. Der erste zeigt einen kleinen Spinner, der zweite versteckt ihn. Wenn ich auf den Link klicke, wird der Spinner angezeigt, aber er wird nicht ausgeblendet.
Vielen Dank für Ihre Antwort. Die Änderung der Reihenfolge hat mein Problem gelöst. :) Was ich versuche zu tun ist eine Art von Schalter, klicken Sie auf ein "lesen" Buch markiert es als "ungelesen" und umgekehrt. Deshalb lese ich den aktuellen Wert, invertiere ihn und speichere ihn zurück. Ich konnte keine bessere Methode finden. – dmnkhhn