在我的rails应用程序中,我使用Sucker Punch gem运行延迟的作业。我循环浏览一些电话号码,向每个人发送短信息,并发送给Twilio。
如果Twilio发送它时出错,我可以通过救援来捕获它,但有没有办法通知用户而不只是提出显示错误页面的异常?
理想情况下,它会在发生时作为Flash消息(或其他通知)。有没有办法做到这一点?
答案 0 :(得分:1)
正如Nick Veys
聊天中所提到的,解决方法是使用数据创建某种持久性。
-
<强>推强>
我认为您正在寻找的功能将通过使用某种"push" technology来实现,尤其是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 instance,然后您可以使用Pusher循环播放:
-
<强>推强>
这样做的价值在于,当您使用Pusher等前端通知服务时,您真正在做的是从您的应用程序中获取数据,并通过websocket发送,或者{ {3}},到前端浏览器
这正是您所需要的 - 能够在用户显示消息时显示消息。为此,我将使用以下内容:
#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 /推送技术的更多信息: