Rails 'серверная подписка ActionCable с параметрами - PullRequest
0 голосов
/ 25 ноября 2018

Я создаю REST API, используя Ruby on Rails в качестве бэкэнда.Этот API используется интерфейсом VueJS.Я не использую внешний интерфейс Rails, внешний интерфейс полностью независим.

Я установил соединение WebSocket с помощью ActionCable, но я пытаюсь отправить параметры в подписку.

У меня есть следующий канал ruby:

class WorkChannel < ApplicationCable::Channel
    def subscribed
        stream_from "works-#{params[:creator_id]}"
    end
end

И в моем интерфейсе JavaScript я подписываюсь на канал, используя этот код:

const msg = {
    command: 'subscribe',
    identifier: JSON.stringify({
        channel: 'WorkChannel',
    }),
};
socket.send(JSON.stringify(msg));

Подписка прошла успешноесли я удаляю переменную в stream_from части.

Во всех прочитанных мною руководствах и уроках я нашел только одно, объясняющее, как взаимодействовать с ActionCable без использования методов внешнего интерфейса Rails.Смотрите здесь для полного руководства.

Однако это руководство не отправляет данные в подписку, и я не могу найти их в документации.

Что такое синтаксис JSON объекта, который мне нужно отправить для эмуляции поведения App.cable.subscriptions.create({channel: 'WorkChannel', creator_id: 1 }?

Я пробовал разные синтаксисы, но ни один из них не работал:

const msg = {
    command: 'subscribe',
    identifier: JSON.stringify({
        channel: 'WorkChannel',
    }),
    creator_id: 1,
};

или

const msg = {
    command: 'subscribe',
    identifier: JSON.stringify({
        channel: 'WorkChannel',
        creator_id: 1,
    }),  
};

и даже

const msg = {
    command: 'subscribe',
    identifier: JSON.stringify({
        channel: 'WorkChannel',
    }),
    data: {
        creator_id: 1,
    },
};

1 Ответ

0 голосов
/ 26 ноября 2018

Вы не хотите отправлять идентификатор пользователя в качестве параметра, его можно использовать.Представьте, что пользователь приостанавливает исключение js, изменяет user_id и возобновляет, он будет получать сообщения, которые отправляются другим пользователям.

Я бы порекомендовал вам попробовать получить идентификатор текущего пользователя от зарегистрированного пользователя, что-то вроде https://guides.rubyonrails.org/action_cable_overview.html#server-side-components

# app/channels/application_cable/connection.rb
module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private
      def find_verified_user
        if verified_user = User.find_by(id: cookies.encrypted[:user_id])
          verified_user
        else
          reject_unauthorized_connection
        end
      end
  end
end

Правильное определение текущего пользователя может изменяться в зависимости от того, какую систему аутентификации вы используете, если вы используете devise, вам может потребоваться получить пользователя от надзирателя следующим образом: https://stackoverflow.com/a/38702351/1430810

...