2014-08-30 4 views
1

В моем приложении rails я выполняю отложенные задания с помощью Sucker Punch gem. Я прокручиваю некоторые номера телефонов, отправляя sms-сообщение каждому с Twilio.флеш-ошибка от отложенной работы в рельсах

Если есть ошибка при отправке Twilio, я могу скрыть его с помощью спасения просто отлично, но есть ли способ уведомить пользователя, не создавая исключение, отображающее страницу с ошибкой?

В идеале это будет как флэш-сообщение (или другое уведомление), когда это произойдет. Есть ли способ сделать это?

+4

магазин ошибка в базе данных, чтобы показать пользователю на следующей странице загрузки, или выпалить по электронной почте пользователю. Два легких. –

ответ

1

Как упоминалось в чате на Nick Veys, решение этого будет заключаться в создании своего рода упорства с данными.

-

Нажмите

Я думаю, что функциональность вы ищете будет достигнуто с помощью какой-то "push" technology, в частности Pusher. Это даст вам возможность создать набор файлов/настроек, которые обеспечат возможность появления сообщения для пользователя.

Я бы лично настроить следующее:

  1. DelayedJob обрабатывает запросы в соответствии с требованиями
  2. Если сообщение появлялось сообщение об ошибке, сохраните ошибку
  3. Отправить сообщение об ошибке пользователю с push-реализация

Поэтому я бы сделал следующее:

#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, front-end браузер

Это действительно то, что вам нужно - возможность отображать сообщение для пользователя как/когда это происходит.Чтобы сделать это, я хотел бы использовать следующее:

#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 технологии здесь:

+1

Спасибо за подробный ответ! Сначала я думал об электронных письмах, но хотел чего-то более быстрого. Я думаю, что в качестве быстрого решения я сделаю это и посмотрю на что-то подобное в будущем. – Scott

 Смежные вопросы

  • Нет связанных вопросов^_^