Controlador Rails: ejecute la acción solo si el método Rails UJS dentro tiene éxito (métodos mutuamente dependientes)

Siguiendo otra pregunta (Controlador Rails: ejecute la acción solo si los dos métodos internos tienen éxito (métodos mutuamente dependientes)), Me gustaría asegurarme de que dentro de una de las acciones de mi controlador, si el usuario no ve el mensaje que muestra un método Rails UJS, los primeros métodos de la acción del controlador tampoco se implementan.

CONTEXTO

Tengo un controlador con un método llamado 'acciones'. Cuando la aplicación entra en el método 'example_action', implementa un primer método (1) update_user_table y luego (2) otro update_userdeal_table. (ambos leerán y escribirán en la base de datos) y luego (3) un tercer método relacionado con una llamada Rails UJS (ajax).

Mi problema es el siguiente: en caso de tiempo de espera en el medio del controlador, quiero evitar el caso en el que se actualiza la tabla Usuario (a través del método 1), la tabla UserDeal se actualiza (a través del método 2) pero NO el tercer método es decir, la solicitud ajax que muestra un mensaje FALLA (error, tiempo de espera, ... estado como 500 o 404 o cancelado o tiempo de espera ...).

En mi aplicación, para usuarios móviles si están en un metro con conexión a Internet, inician la solicitud que pasa por el controlador 'example_action', realiza con éxito el primer método (1) y el segundo método (2) pero luego ingresan a un túnel durante 60 segundos con una conexión a Internet muy baja (<5b / seg) o SIN conexión a Internet, por lo que, por razones de UX, agote el tiempo de la solicitud y le muestro al usuario "lo siento, tomó demasiado tiempo, inténtelo nuevamente". El problema es que si no puedo mostrarles el resultado (3), necesito poder no ejecutar (1) y (2).

Necesito que los dos métodos (1) y (2) y (3) sean "mutuamente dependientes": si uno no tiene éxito, el otro no debe realizarse. Es la mejor manera en que puedo describirlo.

Hoy aquí está mi código. No funciona, ya que estoy probando manualmente haciendo clic y luego, después de solo 2 segundos, desconecto la conexión a Internet. Veo en mi base de datos que (1) y (2) se realizaron y las bases de datos se actualizaron, pero vi el mensaje "lo siento, tomó demasiado tiempo, inténtelo nuevamente".

Ese es el enfoque correcto ? en caso afirmativo, ¿cómo hacer esto? Si no es así, ¿debería intentar un ángulo diferente como: si (1) y (2) tuvieron éxito pero no (3) debo almacenar el hecho de que el estado de los rieles UJS xhr fue un error o tiempo de espera, por lo que el wxas modal no se mostró efectivamente al usuario y luego mostrarles el resultado / mensaje una vez que vuelvan a estar en línea?

Aqui esta el codigo

página html para el usuario&nbsp;el usuario hace clic en un botón que activa una solicitud de Rails UJS aajax que finalmente mostrará el mensaje modal

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

Este envío a una ruta que apunta a esta acción del controlador

Controlador de acuerdo

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

Esto apunta a un archivo de vista js.erb

deal_modal.js.erb

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

Para administrar el ajax, error, tiempos de espera ... (si es necesario para la resolución de la pregunta), utilizo la configuración de Rails UJS.

IMPORTANTE:&nbsp;Es aquí donde, en caso de error o tiempo de espera, envío el mensaje modal de error / tiempo de espera que viene en lugar del que normalmente recibe (vea justo arriba "Aquí está su resultado ...")

$(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);
  };
});