2017-12-09 7 views
0

Auf meinem account.js.coffee habe ich dies zu sehen, wenn Ajax-Ereignisse aufgerufen werden.Rails 5.1.4 Ajax-Problem nach dem Upgrade

$(document).on 'ajax:success', 'form', (event) -> 
console.log 'success' 

$(document).on 'ajax:error', 'form', (event) -> 
console.log 'error' 
class AccountsController < ApplicationController 
def update 
    respond_to do |format| 
     if @account.update(home_params) 
      format.html { redirect_to @account, notice: 'Home was successfully updated.' } 
      format.json { render :show, status: :ok, location: @account } 
      format.js 
     else 
      format.html { render :edit } 
      format.json { render json: @account.errors, status: :unprocessable_entity } 
      format.js 
     end 
    end 
end 

Ende

Wenn ich meine Form einreichen Ferne ein Ajax-Ereignis ausgelöst werden soll, wenn ein Fehler ist, sollte die Ajax-Fehler auslösen, oder wenn das Objekt aktualisiert Trigger worden der Ajax: Erfolg; aber der Ajax-Erfolg wird ausgelöst, wenn ein Fehler im Formular auftritt (leeres Attribut, wenn das Attribut Anwesenheit sein muss), und wenn das Objekt erfolgreich aktualisiert wird, wird kein Ajax-Auslöser ausgelöst. Das Formular hat das remote: true Attribut und auf der application.js.coffee habe ich jQuery, rails-ujs drauf. Das einzige Mal, dass ich ein AJAX-Ereignis erhalte: Fehler-Ereignis ist, wenn ich das Objekt absichtlich von meiner update.js.erb-Seite lösche, um zu sehen, ob der AJAX: -Fehler Auslöser ist. Wenn Schienen waren auf 4,2 (vor dem Update) alles funktioniert ganz gut :(

Dies ist das Ereignis, das ich auf der Konsole empfangen, wenn das ein Fehler auf dem Formular CustomEvent {IsTrusted. Falsch, Detail: Array, initCustomEvent: Funktion, Typ: "ajax: Erfolg", Ziel: ...}

update.js.erb

<% if @account.errors.any? %> 
    <!-- Show errors in to the modal view --> 
    <%= render :partial=>'layouts/js_errors', :locals=> { :target=> @account } %> 

    <!-- Sending error alert --> 
    $('#flash-alerts').html("<div class=\"alert alert-danger\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\"><i class=\"ace-icon fa fa-times\"></i></button><i class=\"ace-icon fa fa-check green\"></i>Something went wrong, please try again later</div>"); 
    timeOutAlert(); 
<% else %> 
    <!-- hidden the modals --> 
    $('#myModal').modal('hide'); 
    $('#myModal .modal-title').html(''); 
    $('#myModal .modal-body').html(''); 

    <!-- Update The title of the accounts/_title from show.html.haml --> 
    $('.page-header h1').html("<%= j render partial: 'title', locals:{account: @account} %>"); 

    <!-- Update the account block --> 
    $('#account').html("<%= j render @account %>"); 

    <!-- Sending successfully alert --> 
    $('#flash-alerts').html("<div class=\"alert alert-success\" role=\"alert\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\"><i class=\"ace-icon fa fa-times\"></i></button><i class=\"ace-icon fa fa-check green\"></i> Account was successfully updated.</div>"); 
    timeOutAlert(); 
<% end %> 

Bisher fand ich heraus, dass, wenn Sie das Formular in einem Bootstrap einfügen (Version 3) modal, dann, wenn Sie das Formular senden (remote: true) und es erfolgreich ist, dann die a Jax: Erfolg Callback wird nicht ausgelöst werden. Wenn das Objekt zurückgesetzt wird, weil ein Fehler (Attribut kann nicht leer sein), dann wird der Ajax: Erfolg ausgelöst. Wenn ich stattdessen das Formular für die Konten/edit.html.haml verwende, dann ist meine Jquery-Validierung der Auslöser und der Ajax: Erfolg wird ausgelöst, wenn das Objekt ebenfalls aktualisiert wird. Danke für Ihre Hilfe.

+0

Bitte zeigen Sie uns Ihre 'update.js.erb' – s3tjan

+0

okay, aktualisiert .. danke für Ihre Hilfe – helmutrs

Antwort

1

Vielleicht könnte dies helfen, nach den Dokumenten Rails 5.1 eingeführt rails-ujs und jQuery als Abhängigkeit fallen gelassen. Als Folge verursacht diese Einführung Änderungen an benutzerdefinierten Ereignissen, die während der Anfrage ausgelöst wurden, siehe: 3.5 Rails-ujs event handlers (edge).

Nach jquery-UJS Wiki, ajax:error nur trigged ist:

Wenn eine Anfrage ist fehlgeschlagen auf dem Server.
https://github.com/rails/jquery-ujs/wiki/ajax

diesem Grund sollten Sie immer ajax:success auch erhalten, wenn das Formular einen Validierungsfehler aufweist.

+0

Yeap, danke für die Antwort und du bist richtig auf diesen Teil. Nach einigen Tagen öffne ich einen Fehlerbericht auf rails-ujs, denn wenn das Objekt nicht prozessiert wurde, weil (in meinem Fall) ein Attribut leer ist (das Modell erzwingt, dass das Attribut nicht leer ist), sollte es automatisch fehlschlagen auf der Ajax-Seite (wie in Json Unprocessed_Entity), wenn nicht, was ist der Sinn von Konventionen über die Konfiguration, wenn Rails nicht automatisch damit umgehen können. :) Danke für deine Antwort. Es muss noch herausgefunden werden, warum es kein Trigger im Bootstrap-Modus sein soll, nachdem ein Objekt erfolgreich aktualisiert wurde – helmutrs

Verwandte Themen