Как я могу обработать ошибки в модели Rails, у которой нет контроллера и представлений - PullRequest
0 голосов
/ 28 марта 2019

У меня есть модель, которая является мостом между моим Rails-приложением и API и не имеет контроллера и представлений.

В следующем методе я получаю сообщение об ошибке ActiveResource::ResourceNotFound.


      def find_order(order_id, cached: false)
        within_temp_session do
          order = find_cached_order(order_id) if cached
          unless order
            order = API::Order.find(order_id)  # here the order can be absent
            cache_order(order.attributes)
          end
          order
        end
      end

Идеи, которые у меня были, не были хорошими с разных точек зрения, например, нарушение концепции MVC с вызовом метода контроллера в модели.

РЕДАКТИРОВАТЬ : redirect_to, flash[:alert] не работают естественным образом, а также errors.add error.

Использование attr_accessor помогло добавить ошибки в экземпляр модели, но я нигде не использую экземпляр модели.

Как уведомить пользователя, что произошла ошибка?

Вот трассировка:

10 File "/app/app/models/model1.rb", line 24 in block in find_order
11 File "/app/app/models/model1.rb", line 97 in block in within_temp_session
+ 1 non-project frame
13 File "/app/app/models/model1.rb", line 97 in within_temp_session
14 File "/app/app/models/model1.rb", line 21 in find_order
15 File "/app/app/models/model2.rb", line 76 in find_order
16 File "/app/app/models/model3.rb", line 45 in order
17 File "/app/app/models/model3.rb", line 69 in build_call
18 File "/app/app/models/model3.rb", line 50 in shipping_label_form
19 File "/app/app/models/model3.rb", line 55 in create_label
20 File "/app/app/jobs/job.rb", line 8 in block in perform
+ 2 non-project frames
23 File "/app/app/jobs/job.rb", line 7 in perform

РЕДАКТИРОВАТЬ 2: Пользователь нажимает кнопку get shipping label, которая запускает действие :new в ShippingLabelsController, которое предварительно заполняет форму и запускает действие :perform отложенного задания для создания метки. И ошибка возникает после запуска задания.

1 Ответ

0 голосов
/ 28 марта 2019

SomeJob.perform_later запускает асинхронное задание. Мы не можем знать, когда это закончится. Так что да, это сложно сообщить пользователю, что произошла ошибка. Но нужно ли информировать пользователя?

Хорошая вещь о заданиях в очереди - если они терпят неудачу, вы можете попробовать их снова. И опять. И снова, пока они не сработают или вы не сдадитесь. Когда вы работаете с API, в API и сети будут возникать временные ошибки, которые разрешаются сами собой. Не беспокойте пользователя этим.

ActiveJob имеет retry_on, чтобы сообщить работе, какие исключения следует повторить.

class SomeJob < ApplicationJob
  retry_on ActiveResource::ResourceNotFound

  ...
end

Теперь ваша работа будет спокойно повторяться в случае сбоя API.

ActiveResource::ResourceNotFound - довольно грубое исключение, которое может произойти по многим причинам, поэтому в конечном итоге вы захотите перехватить и выбросить более конкретные исключения в вашей модели для более точной настройки обработки ошибок.


Число попыток ограничено. Если количество повторных попыток исчерпано, тогда человеку нужно вмешаться и посмотреть, что не так. Этот человек не пользователь, они не знают, как это исправить, это администратор.

Когда retry_on исчерпывает свои попытки, исключительная ситуация всплывает в систему очередей, которая должна сообщить администратору, что в очереди есть мертвый элемент. Детали этого зависят от того, какую систему очередей вы используете.


Если пользователю нужно сообщить, есть несколько вариантов. Одним из них является добавление массива ошибок в модель User. Пользовательский интерфейс будет отображаться и отображать любые ошибки в массиве ошибок пользователя, возможно, в мгновение ока.

Затем вы передаете пользователя в работу. Если в задании есть какие-либо ошибки, они отлавливаются и добавляются в связанный с ним массив ошибок пользователя. В следующий раз, когда пользователь использует ваш пользовательский интерфейс, он увидит ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...