2014-08-30 70 views
1

在我的導軌應用程序中,我使用Sucker Punch gem運行延遲作業。我正在通過一些電話號碼循環發送短信給每個Twilio。從導軌延遲作業中的閃存錯誤

如果Twilio發送錯誤,我可以通過救援來捕獲它,但是有沒有辦法通知用戶而不會引發顯示錯誤頁面的異常?

理想情況下,它將作爲一個flash消息(或其他通知)發生時。有沒有辦法做到這一點?

+4

存放在數據庫上顯示他們的下一個頁面加載的用戶,或火了一封電子郵件給用戶的錯誤。兩個簡單的。 – 2014-08-30 03:38:44

回答

1

正如在Nick Veys的聊天中提到的,解決方案是創建某種數據的持久性。

-

我認爲你正在尋找將通過使用某種"push" technology,特別是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 instance,然後可以循環通過與推杆:

-

這樣做的價值在於,當您使用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服務連接,允許您「收聽」從服務器收到的更新。這意味着如果您可以使用上面的代碼填充這些更新(錯誤消息),那麼您可以在用戶與您的應用進行交互時將錯誤發送給用戶。

您瞭解了更多關於推送/推送技術在這裏:

+1

感謝您的深入解答!我首先想到了電子郵件,但想要更快一點。我認爲作爲一種快速解決方案,我會在未來做到這一點,並期待這樣的事情。 – Scott 2014-09-02 15:45:09