Controlador Rails - execute a ação somente se o método RJ UJS dentro de êxito (métodos mutuamente dependentes)

Após outra pergunta (Controlador Rails - executa a ação somente se os dois métodos internos tiverem êxito (métodos mutuamente dependentes)), Gostaria de garantir que, dentro de uma ação do meu controlador, se o usuário não vir a mensagem exibida pelo método Rails UJS, os primeiros métodos da ação do controlador também não sejam implementados.

CONTEXTO

Eu tenho um controlador com um método chamado 'actions'. Quando o aplicativo entra no método 'exemplo_ação', ele implementa um primeiro método (1) update_user_table e, em seguida, (2) outro update_userdeal_table. (ambos lerão e gravarão o banco de dados) e, em seguida, (3) um terceiro método relacionado a uma chamada Rails UJS (ajax).

Meu problema é o seguinte: em caso de tempo limite no meio do controlador, quero evitar o caso em que a tabela User (via método 1) é atualizada, a tabela UserDeal é atualizada (via método 2), mas NÃO o método thrid ou seja, a solicitação ajax que exibe uma mensagem FAILS (erro, tempo limite, ... status como 500 ou 404 ou cancelado ou tempo limite ...).

No meu aplicativo, para usuários móveis, se estiverem em um metrô com conexão à Internet, eles iniciam a solicitação que passa pelo controlador 'example_action', executam com êxito o primeiro método (1) e o segundo método (2), mas depois entram em um túnel por 60 segundos com uma conexão à Internet muito baixa (<5b / s) ou SEM, portanto, por motivos de experiência do usuário, limite o tempo limite da solicitação e mostro ao usuário 'desculpe a demora, tente novamente'. O problema é que, se não consegui mostrar o resultado (3), preciso ser capaz de não executar (1) e (2).

Preciso que os dois métodos (1) e (2) e (3) sejam "mutuamente dependentes": se um não for bem-sucedido, o outro não deverá ser executado. É a melhor maneira de descrever.

Hoje Aqui está o meu código. Não está funcionando, pois estou testando manualmente clicando e depois de apenas 2 segundos desconecto a conexão à Internet. Vejo no meu banco de dados que (1) e (2) foram executados e os bancos de dados foram atualizados, mas vi a mensagem 'desculpe, demorou muito tempo, tente novamente'.

Essa é a abordagem correta? Se sim, como fazer isso? Caso contrário, devo tentar um ângulo diferente como: se (1) e (2) foram bem-sucedidos, mas não (3) devo armazenar o fato de que o status do UJS xhr dos trilhos foi um erro ou tempo limite, que consequentemente os wx modais não foram efetivamente exibidos para o usuário e, em seguida, mostrar o resultado / mensagem assim que voltarem a ficar online?

Aqui está o código

página html para o usuário o usuário clica em um botão que aciona uma solicitação aajax do Rails UJS que exibirá finalmente a mensagem modal

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

Isso é enviado para uma rota que aponta para esta ação do controlador

Controlador de transações

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

Isso aponta para um arquivo de exibição js.erb

deal_modal.js.erb

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

Para gerenciar o ajax, erro, timeouts ... (se necessário para a resolução da pergunta), eu uso as configurações do Rails UJS.

IMPORTANTE: É aqui que, em caso de erro ou tempo limite, envio a mensagem modal de erro / tempo limite que substitui a que você normalmente recebe (veja logo acima "Aqui está o seu 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);
  };
});

questionAnswers(1)

yourAnswerToTheQuestion