В моем проекте 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.
Спасибо.