Как упоминалось в чате на Nick Veys
, решение этого будет заключаться в создании своего рода упорства с данными.
-
Нажмите
Я думаю, что функциональность вы ищете будет достигнуто с помощью какой-то "push" technology, в частности Pusher
. Это даст вам возможность создать набор файлов/настроек, которые обеспечат возможность появления сообщения для пользователя.
Я бы лично настроить следующее:
DelayedJob
обрабатывает запросы в соответствии с требованиями
- Если сообщение появлялось сообщение об ошибке, сохраните ошибку
- Отправить сообщение об ошибке пользователю с 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 технологии здесь:
магазин ошибка в базе данных, чтобы показать пользователю на следующей странице загрузки, или выпалить по электронной почте пользователю. Два легких. –