Rails controller - выполнить действие, только если метод Rails UJS внутри завершился успешно (взаимозависимые методы)

После другого вопроса (Контроллер Rails - выполняет действие, только если два метода внутри успешно (взаимозависимые методы)), Я хотел бы убедиться, что внутри одного из действий моего контроллера, если пользователь не увидит сообщение, отображаемое методом Rails UJS, то первые методы действия контроллера также не будут реализованы.

КОНТЕКСТ

У меня есть контроллер с методом, называемым «действия». Когда приложение входит в метод example_action, оно реализует первый метод (1) update_user_table, а затем (2) другой update_userdeal_table. (оба будут читать и записывать базу данных), а затем (3) третий метод, который связан с вызовом Rails UJS (ajax).

Моя проблема заключается в следующем: в случае тайм-аута в середине контроллера, я хочу избежать случая, когда таблица User (через метод 1) обновляется, таблица UserDeal обновляется (через метод 2), но НЕ метод thrid то есть ajax-запрос, который отображает сообщение FAILS (ошибка, время ожидания, ... состояние, например, 500 или 404, или отменено, или время ожидания ...).

В моем приложении для мобильных пользователей, если они находятся в метро с подключением к Интернету, они запускают запрос, который проходит через контроллер «example_action», успешно выполняет первый метод (1) и второй метод (2), но затем они входят в туннель в течение 60 секунд при очень очень низком (<5b / sec) или отсутствии подключения к Интернету, поэтому по причинам UX я тайм-аут запроса и отображаю пользователю «извините, что это заняло слишком много времени, попробуйте еще раз». Проблема в том, что, если я не смог показать им результат (3), мне нужно иметь возможность не выполнять (1) и (2).

Мне нужно, чтобы два метода (1) и (2) и (3) были «взаимозависимыми»: если один не удастся, другой не следует выполнять. Это лучший способ, которым я могу это описать.

Сегодня вот мой код. Это не работает, так как я вручную тестирую, нажимая, а затем через 2 секунды я отключаю интернет-соединение. Я вижу в своей базе данных, что (1) и (2) были выполнены, и базы данных были обновлены, но я увидел сообщение «извините, что это заняло слишком много времени, попробуйте снова».

Это правильный подход? если да как это сделать? Если нет, я должен попробовать другой угол, например: если (1) и (2) были успешными, но не (3) я должен сохранить тот факт, что состояние рельсов UJS xhr было ошибкой или тайм-аутом, что, следовательно, модальные wxas не отображались эффективно пользователю, а затем показать ему результат / сообщение, как только они вернутся в онлайн?

Вот код

HTML-страница для пользователя пользователь нажимает на кнопку, которая запускает ajjax-запрос Rails UJS, который в конечном итоге отображает модальное сообщение

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

Это отправляет на маршрут, который указывает на это действие контроллера

Контроллер сделок

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

Это указывает на файл просмотра js.erb

deal_modal.js.erb

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

Для управления ajax, ошибками, тайм-аутами ... (при необходимости для разрешения вопроса) я использую настройки Rails UJS.

ВАЖНЫЙ: Именно здесь, в случае ошибки или тайм-аута, я посылаю модальное сообщение об ошибке / тайм-ауте, которое приходит вместо того, которое вы обычно получаете (см. Чуть выше «Вот ваш результат ...»)

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

Ответы на вопрос(1)

Ваш ответ на вопрос