Ошибка прошивки из-за отложенной работы в рельсах
В моем приложении rails я выполняю отложенные задания с помощью самоцвета Sucker Punch. Я перебираю некоторые телефонные номера, отправляя смс-сообщение каждому с Twilio.
Если при отправке Twilio произошла ошибка, я могу прекрасно ее перехватить, но есть ли способ уведомить пользователя, не вызывая исключение, отображающее страницу ошибки?
В идеале, это должно быть как мгновенное сообщение (или другое уведомление), когда это происходит. Есть ли способ сделать это?
1 ответ
Как уже упоминалось в чате Nick Veys
Решение этой проблемы будет заключаться в том, чтобы создать какое-то постоянство с данными.
-
От себя
Я думаю, что функциональность, которую вы ищете, будет достигнута с помощью некоторой технологии "толчка", особенно Pusher
, Это даст вам возможность создать набор файлов / настроек, которые обеспечат возможность появления сообщения для пользователя.
Я бы лично настроил следующее:
DelayedJob
обрабатывает запросы по мере необходимости- Если сообщение вызвало ошибку, сохраните ошибку
- Отправить сообщение об ошибке пользователю с реализацией 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 здесь: