У меня есть приложение rails с REST API, созданное с использованием активной модели сериализатора.
Чтобы упростить задачу - скажем, у меня есть сериализатор Post
, который возвращает title
сообщения и is_voted
со значением true
или false
в зависимости от того, вошел ли пользователь в систему и проголосовал за него.эта история или нет.
attribute :is_voted do
voteable_ids = current_user.account.votes.where(voteable_type: 'Post').map(&:voteable_id)
voteable_ids.include? object.id
end
И пока все прекрасно работает, но все становится сложнее, когда я хочу уведомить клиента javascript об изменениях в записи Post
.
Допустим, название изменилось, и я хочуотправить событие actioncable об этом:
ActionCable.server.broadcast 'updates_channel', {
event: 'posts.updated',
data: ActiveModelSerializers::SerializableResource.new(post).to_json
}
Дело в том, что при отправке такого события я не знаю, что такое current_user
на данный момент, так как оно вызывается бэкэндом.Или в принципе может быть вызван другим пользователем.Но если я правильно понимаю, конечная точка actioncable знает, кто такой current_user
, так что теоретически это можно было бы сделать.
Я думал - возможно ли как-то внедрить current_user в этот сериализатор в некоторыхсвоего рода промежуточное программное обеспечение actioncable?Я могу аутентифицировать пользователей на моей конечной точке кабеля действия, используя identified_by :current_user
, но я не знаю, как использовать его в этом сценарии.
Другая идея - просто отправить событие об обновлении сообщения только с идентификатором записи.Позже, на стороне JS, я могу просто получить этот конкретный пост с использованием обычного API REST и обновить представление - но это звучит как супер неоптимальное решение.