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