在我的導軌應用程序中,我使用Sucker Punch gem運行延遲作業。我正在通過一些電話號碼循環發送短信給每個Twilio。從導軌延遲作業中的閃存錯誤
如果Twilio發送錯誤,我可以通過救援來捕獲它,但是有沒有辦法通知用戶而不會引發顯示錯誤頁面的異常?
理想情況下,它將作爲一個flash消息(或其他通知)發生時。有沒有辦法做到這一點?
在我的導軌應用程序中,我使用Sucker Punch gem運行延遲作業。我正在通過一些電話號碼循環發送短信給每個Twilio。從導軌延遲作業中的閃存錯誤
如果Twilio發送錯誤,我可以通過救援來捕獲它,但是有沒有辦法通知用戶而不會引發顯示錯誤頁面的異常?
理想情況下,它將作爲一個flash消息(或其他通知)發生時。有沒有辦法做到這一點?
正如在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等前端通知服務時,您真正在做的是從您的應用程序獲取數據,並通過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服務連接,允許您「收聽」從服務器收到的更新。這意味着如果您可以使用上面的代碼填充這些更新(錯誤消息),那麼您可以在用戶與您的應用進行交互時將錯誤發送給用戶。
您瞭解了更多關於推送/推送技術在這裏:
感謝您的深入解答!我首先想到了電子郵件,但想要更快一點。我認爲作爲一種快速解決方案,我會在未來做到這一點,並期待這樣的事情。 – Scott 2014-09-02 15:45:09
存放在數據庫上顯示他們的下一個頁面加載的用戶,或火了一封電子郵件給用戶的錯誤。兩個簡單的。 – 2014-08-30 03:38:44