在我的 Rails 应用程序中,我正在使用 Sucker Punch gem 运行延迟作业。我正在循环使用 Twilio 向每个电话号码发送一条短信。
如果 Twilio 发送它时出错,我可以通过救援来捕获它,但是有没有办法通知用户而不只是引发显示错误页面的异常?
理想情况下,它会在它发生时作为一条消息(或其他通知)。有没有办法做到这一点?
在我的 Rails 应用程序中,我正在使用 Sucker Punch gem 运行延迟作业。我正在循环使用 Twilio 向每个电话号码发送一条短信。
如果 Twilio 发送它时出错,我可以通过救援来捕获它,但是有没有办法通知用户而不只是引发显示错误页面的异常?
理想情况下,它会在它发生时作为一条消息(或其他通知)。有没有办法做到这一点?
正如在聊天中提到的Nick Veys
,解决这个问题的方法是使用数据创建某种持久性。
--
推
我认为您正在寻找的功能将通过使用某种“推送”技术来实现,特别是Pusher
。这将使您能够创建一组文件/设置,这些文件/设置将使消息能够显示给用户。
我会亲自设置以下内容:
DelayedJob
根据需要处理请求- 如果消息引发错误,则存储错误
- 使用推送实现将错误消息发送给用户
所以我会这样做:
#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 等前端通知服务时,您真正要做的是从应用程序中获取数据,并通过websocket或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 技术的更多信息: