导轨中延迟作业的闪存错误

时间:2014-08-30 03:17:39

标签: ruby-on-rails ruby twilio sucker-punch

在我的rails应用程序中,我使用Sucker Punch gem运行延迟的作业。我循环浏览一些电话号码,向每个人发送短信息,并发送给Twilio。

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

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

1 个答案:

答案 0 :(得分:1)

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

-

<强>推

我认为您正在寻找的功能将通过使用某种"push" technology来实现,尤其是Pusher。这将使您能够创建一组文件/设置,以便为用户显示消息。

我个人会设置以下内容:

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

所以我会这样做:

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