Число подписок Actioncable - PullRequest
       42

Число подписок Actioncable

0 голосов
/ 15 октября 2018

В моем проекте Ruby on Rails у меня есть Билеты MVC.Типичная страница для редактирования заявки (например, заявка с идентификатором 5) будет /tickets/5/edit.

На другой странице у меня есть простая таблица, в которой я хочу показать, в реальном времени, сколько пользователей просматривают для каждого тикета (т.е. показать, сколько пользователей на /tickets/1/edit, tickets/2/edit ....

Всякий раз, когда пользователь вошел в систему и зашел посмотреть билет на /tickets/:id/edit, у меня есть кофейный текст ticket_notifications.coffee, который выглядит так:

$ ->
  if $('body').attr('data-controller') == 'tickets' && $('body').attr('data-action') == 'edit'
    ticketId = document.getElementById('ticket_id').value
    App.ticket_notifications = App.cable.subscriptions.create {channel: "TicketNotificationsChannel", ticket_id: ticketId},
      connected: ->
# Called when the subscription is ready for use on the server
      disconnected: ->
# Called when the subscription has been terminated by the server
      received: (data) ->

Мой app/channels/ticket_notifications_channel.rb выглядит:

class TicketNotificationsChannel < ApplicationCable::Channel
  def subscribed
    # stream_from "some_channel"
    if current_user&.account
      stream_from "ticket_notifications_channel_#{current_user.account_id}"
      if params[:ticket_id]
        if Ticket.find(params[:ticket_id]).account == current_user.account
          ActionCable.server.broadcast "ticket_notifications_channel_#{current_user.account_id}",
                                       {stuff: "Agent #{current_user.email} is viewing ticket #{params[:ticket_id]}"}
        end
      end
    end
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

Внешний стол выглядит так (я использую Slim, но похож на erb):

table.table.table-hover
            thead
              tr
                th
                  | Ticket #
                th
                  | Short Code
                th
                  | Mobile Number
                th
                  | Number of Tickets
                th
                  | Updated At
                th
                  | Viewers
            tbody
              - unless @tickets.empty?
                - current_time = Time.now
                - @tickets.each do |tkt|
                  - tkt_updated_at = tkt.updated_at
                  tr.m-unread.m-tr-clickable data-href=edit_ticket_path(id: tkt.id)
                    td
                      b #{tkt.id}
                    td
                      b #{tkt.short_code}
                    td
                      b #{tkt.mobile_number}
                    td
                      - if last_message = tkt.messages&.last&.body
                        b #{last_message[0..60]}
                    td
                      - if (current_time-tkt_updated_at) <= time_period
                        b #{time_ago_in_words(tkt_updated_at)} ago
                      - else
                        b #{tkt_updated_at.in_time_zone.strftime('%b %e %H:%M:%S %Y')}
                    td
                      b Count how many subscriptions to tickets_notifications channel with params tkt.id here. 

Спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете проверить ответ на следующий вопрос:

Как узнать, кто подключен к ActionCable?

В основном вам нужно сделать.

Redis.new.pubsub("channels", "action_cable/*")

Это даст вам все активные каналы pubsub.

Также вы можете указать userId, а также ticketId при создании новой подписки, например:

App.cable.subscriptions.create {channel: "TicketNotificationsChannel", ticket_id: ticketId, user_id: userId}

Так что теперь Redis.new.pubsub("channels", "action_cable/*") предоставит вам все активные подписки следующим образом

["action_cable/Z2lkOi8vYXBpL1VzZXIvMTUwMjIz", "action_cable/Z2lkOi8vYXBpL1VzZXIvMTUwNTc0"]

Doing Base64.decodeиз вышеперечисленных строк даст вам вывод следующим образом "gid://api/User/150223/Ticket/1".Затем вы можете построить некоторую логику для этого вывода, которая подсчитывает количество пользователей для определенного идентификатора заявки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...