1

在我的 Rails 应用程序中,我正在使用 Sucker Punch gem 运行延迟作业。我正在循环使用 Twilio 向每个电话号码发送一条短信。

如果 Twilio 发送它时出错,我可以通过救援来捕获它,但是有没有办法通知用户而不只是引发显示错误页面的异常?

理想情况下,它会在它发生时作为一条消息(或其他通知)。有没有办法做到这一点?

4

1 回答 1

1

正如在聊天中提到的Nick Veys,解决这个问题的方法是使用数据创建某种持久性。

--

我认为您正在寻找的功能将通过使用某种“推送”技术来实现,特别是Pusher。这将使您能够创建一组文件/设置,这些文件/设置将使消息能够显示给用户。

我会亲自设置以下内容:

  1. DelayedJob根据需要处理请求
  2. 如果消息引发错误,则存储错误
  3. 使用推送实现将错误消息发送给用户

所以我会这样做:

#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 等前端通知服务时,您真正要做的是从应用程序中获取数据,并通过websocketSSE将其发送到前端浏览器

这确实是您所需要的——能够在消息发生时向用户显示消息。为此,我将使用以下内容:

#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 技术的更多信息:

于 2014-08-30T12:53:40.587 回答