Ошибка прошивки из-за отложенной работы в рельсах

В моем приложении rails я выполняю отложенные задания с помощью самоцвета Sucker Punch. Я перебираю некоторые телефонные номера, отправляя смс-сообщение каждому с Twilio.

Если при отправке Twilio произошла ошибка, я могу прекрасно ее перехватить, но есть ли способ уведомить пользователя, не вызывая исключение, отображающее страницу ошибки?

В идеале, это должно быть как мгновенное сообщение (или другое уведомление), когда это происходит. Есть ли способ сделать это?

1 ответ

Решение

Как уже упоминалось в чате Nick Veys Решение этой проблемы будет заключаться в том, чтобы создать какое-то постоянство с данными.

-

От себя

Я думаю, что функциональность, которую вы ищете, будет достигнута с помощью некоторой технологии "толчка", особенно Pusher, Это даст вам возможность создать набор файлов / настроек, которые обеспечат возможность появления сообщения для пользователя.

Я бы лично настроил следующее:

  1. DelayedJob обрабатывает запросы по мере необходимости
  2. Если сообщение вызвало ошибку, сохраните ошибку
  3. Отправить сообщение об ошибке пользователю с реализацией push

Так что я бы сделал это:

#Gemfile
gem 'aasm', '~> 3.3.3'
gem 'pusher', '~> 0.14.1'

#app/models/message.rb
class Message < ActiveRecord::Base
   include AASM

   aasm do
     state :queued, :initial => true
     state :sending
     state :delivered
     state :error

     event :sent do
       transitions :from => [:queued, :sending], :to => :sent
     end

     event :raise_error do
       transition :from => [:queued, :sending], :to => :error, :on_transition => Proc.new {|obj, *args| obj.set_message(*args) }
     end

     def set_message(message)
        self.update(error: message)
        Redis.lpush(self.user.id, self.id)
     end
   end

end

Это означает, что если вы попытаетесь отправить сообщение, вы сможете обновить сообщение следующим образом:

@message = Message.find params[:id]
if [[message.send_error]]
    @message.raise_error(error.message)
end

Это означает, что вы сможете добавлять сообщения в экземпляр Redis, который затем можно циклически перебирать с помощью Pusher:

-

толкатель

Значение этого в том, что когда вы используете интерфейсную службу уведомлений, такую ​​как Pusher, вы действительно берете данные из своего приложения и отправляете их через веб-сокет или, возможно, SSE, в интерфейсный браузер.

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

#app/assets/javascripts/application.js
pusher = new Pusher("**************")

channel = pusher.subscribe("private-user-[[username]]")             
channel.bind "error", (data) ->
    alert data.message

Это даст вам возможность обрабатывать созданную вами очередь Redis, позволяя отправлять запрошенные обновления по мере их поступления:

#app/workers/pusher.rb
class PusherQueue
   @queue = :pusher
   def self.perform(user, message)
       # push message here
   end
end

Это связано со службой Pusher, что позволяет вам "прослушивать" обновления, которые вы будете получать с сервера. Это означает, что если вы сможете заполнять эти обновления (сообщения об ошибках) с помощью приведенного выше кода, вы сможете отправлять ошибки пользователям, когда они взаимодействуют с вашим приложением

Вы читаете больше о технологиях Pusher / push здесь:

Другие вопросы по тегам