Я новичок в ActionCable и сокетах и пытаюсь реализовать некоторые функции в реальном времени.
Я успешно реализовал в своем приложении функцию уведомлений в реальном времени (базовую), однако есть несколько вещей, на которые я потратил некоторое время, чтобы понять.
Мой код уведомлений в реальном времени:
Процесс аутентификации:
# Connection.rb (using Devise)
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = env['warden'].user
reject_unauthorized_connection unless self.current_user
logger.add_tags 'ActionCable', current_user.email
end
end
end
Канал уведомления:
class NotificationsChannel < ApplicationCable::Channel
def subscribed
stream_from "notification_channel_#{current_user.id}"
end
def unsubscribed
end
end
Уведомления. Кофе
App.notifications = App.cable.subscriptions.create "NotificationsChannel",
connected: ->
disconnected: ->
received: (data) ->
this.update_counter(data.counter)
# if use_sound is "true" play a mp3 sound
# use_sound is sent ("true" or "false") because when a notification is destroyed we don't want to use sound only update counter
if data.use_sound == "true"
$("#sound-play").get(0).play()
# Update Notifications Counter and change color
update_counter: (counter) ->
$("#notifications-counter").html("#{counter}")
if counter > 0
$("#notifications-counter").css('color','#FFA5A5')
else
$("#notifications-counter").css('color','white')
И есть файл Job, который мы транслируем на канал со счетчиком уведомлений.
Примечание. Я отправляю только количество уведомлений, потому что на панели навигации, когда пользователь нажимает кнопку (например, 2 Уведомления), раскрывающийся список переключается и заполняется с помощью вызова AJax.
Мои вопросы:
Нормально ли постоянно иметь запросы «GET / cable» с ответом «Попытка несанкционированного подключения отклонена», когда пользователь не вошел в систему (я понимаю, что current_user в файле Connect.rb устанавливается из файла cookie, но когда пользователь находится на бывшей домашней странице, странице входа в систему и т. д. в основном не аутентифицирован.
В журналах сервера каждые 1,2 секунды я вижу GET / cable
Это нормально? Я думаю, что мне нужно как-то это остановить, если пользователь выйдет из системы или что-то в этом роде.
Когда я запускаю сервер, я получаю следующую ошибку примерно за 10 секунд, пока сервер не запустится в консоли браузера. Поскольку уведомления работают, я не знаю, проблема ли это, но это ошибка.
Соединение WebSocket с 'ws: // localhost: 3000 / cable' не удалось: ошибка при установлении соединения: net :: ERR_CONNECTION_REFUSED
Я даже попытался установить config.action_cable.mount_path = "/ cable" или "ws: // localhost: 3000 / cable", но не исправил.
Затем я хочу реализовать чат, где 2 пользователя могут вести частный разговор, это «current_user», определенный в Connection.rb «secure», как я могу добавить авторизацию в ActionCable или что-то в этом роде. В остальной части своего приложения я использую CanCan Gem и отлично работает.
Большое спасибо за время, потраченное на чтение вопроса. Если у вас есть ответы на мои вопросы, я буду очень признателен. И если у вас есть какие-то направления или советы по созданию сложного и безопасного чата с ActionCable, я хотел бы их услышать. Спасибо!