Rails-Controller - Aktion nur ausführen, wenn die darin enthaltene Rails-UJS-Methode erfolgreich ist (voneinander abhängige Methoden).

Folgen Sie einer anderen Frage Rails-Controller - Aktion nur ausführen, wenn die beiden darin enthaltenen Methoden erfolgreich sind (voneinander abhängige Methoden)) Möchte ich sicherstellen, dass in einer der Aktionen meines Controllers auch die ersten Methoden der Controller-Aktion nicht implementiert werden, wenn der Benutzer die von einer Rails-UJS-Methode angezeigte Meldung nicht sieht.

KONTEX

Ich habe einen Controller mit einer Methode namens 'actions'. Wenn sich die App in der Methode 'example_action' befindet, implementiert sie eine erste Methode (1) update_user_table und dann (2) eine andere update_userdeal_table. (beide lesen und schreiben die Datenbank) und dann (3) eine dritte Methode, die sich auf einen Rails UJS (Ajax) -Aufruf bezieht.

Mein Problem ist das folgende: Im Falle einer Zeitüberschreitung in der Mitte des Controllers möchte ich den Fall vermeiden, in dem die Benutzertabelle (über Methode 1) aktualisiert wird, die UserDeal-Tabelle (über Methode 2) jedoch NICHT die dritte Methode, dh die Ajax-Anforderung, die eine Meldung FAILS (Fehler, Zeitüberschreitung, ... Status wie 500 oder 404 oder Abgebrochen oder Zeitüberschreitung ...) anzeigt.

In meiner App starten mobile Benutzer, die sich in einer U-Bahn mit Internetverbindung befinden, die Anforderung, die den Controller 'example_action' durchläuft, die erste Methode (1) und die zweite Methode (2) erfolgreich, geben dann jedoch eine ein Tunnel für 60 Sekunden mit sehr sehr geringer (<5 b / s) oder KEINER Internetverbindung. Aus UX-Gründen habe ich eine Zeitüberschreitung für die Anforderung festgestellt und dem Benutzer angezeigt, dass es zu lange gedauert hat. Versuchen Sie es erneut. Das Problem ist, dass ich, wenn ich ihnen das Ergebnis (3) nicht zeigen konnte, in der Lage sein muss, (1) und (2) nicht auszuführen.

Ich brauche die beiden Methoden (1) und (2) und (3), um "voneinander abhängig" zu sein: Wenn eine nicht erfolgreich ist, sollte die andere nicht durchgeführt werden. So kann ich es am besten beschreiben.

Heute Hier ist mein Code. Es funktioniert nicht, da ich manuell teste, indem ich auf klicke und dann nach nur 2 Sekunden die Internetverbindung trenne. Ich sehe in meiner Datenbank, dass (1) und (2) ausgeführt wurden und die Datenbanken aktualisiert wurden, aber ich sah die Meldung "Entschuldigung, es hat zu lange gedauert, versuchen Sie es erneut.&quo

Ist das der richtige Ansatz? wenn ja wie geht das? Wenn nicht, sollte ich einen anderen Blickwinkel versuchen: Wenn (1) und (2) erfolgreich waren, aber nicht (3), sollte ich die Tatsache speichern, dass der UJS xhr-Status der Schienen ein Fehler oder eine Zeitüberschreitung war, und folglich das modale wx nicht effektiv angezeigt wurde dem Benutzer und zeigen ihnen dann das Ergebnis / die Nachricht, sobald sie wieder online sind?

Hier ist der Code

html Seite für den Benutzer Der Benutzer klickt auf eine Schaltfläche, die eine Rails UJS-Aajax-Anforderung auslöst, die letztendlich die modale Meldung anzeigt.

<div id=zone"> 
   <%= link_to image_tag(smallest_src_request),
          deal_modal_path,
           remote: true %>
</div>

Dieses Senden an eine Route, die auf diese Controller-Aktion verweist

Deal controller

class DealsController < ApplicationController
  def deal_modal
    Deal.transaction do
       update_user_table # that's the (1)
       update_userdeal_table  # that's the (2)
       # show_modal_message
       respond_to do |format|
         format.js
       end  
  end

  private
  def update_user_table
    # update the table User so it needs to connect to internet and acces the distant User table
  end
  def update_userdeal_table
    # update the table UserDeal table so it needs to connect to internet and access the distant UserDeal table
  end
end

Dies zeigt auf eine js.erb-Ansichtsdatei

deal_modal.js.erb

showModalMessage("Here is your result <variable and all>);

Zum Verwalten von Ajax, Fehlern, Timeouts ... (ggf. zur Lösung der Frage) verwende ich Rails-UJS-Einstellungen.

WICHTIG Hier sende ich im Falle eines Fehlers oder einer Zeitüberschreitung die modale Fehlermeldung / Zeitüberschreitung, die an die Stelle der Meldung tritt, die Sie normalerweise erhalten (siehe oben "Hier ist Ihr Ergebnis ..").

$(document).on('page:change', function () {
      $("#zone").
        on('ajax:error',function(event,xhr, status, error){
          console.log(' ajax call failed:', error);
          var msg;
          msg = Messenger().post({
            hideAfter:  4, 
            message:    "sorry it took too long, try again."
          });
    });

$(document).on('page:change', function () {
  //set timeout Rails UJS ajax option that will display message for ajax:error cases defined above
  $.rails.ajax = function(options) {
    if (!options.timeout) {
      options.timeout = 5000;
    }    
    return $.ajax(options);
  };
});