Каналы, похоже, не предназначены для конкретной страницы (точно так же, как контроллеры не привязаны к странице), но вы можете ограничить свой канал (как вы пытаетесь сделать), чтобы подписка получала сообщения только для данной категории.
Вы можете выборочно включить js-файл канала на страницу, поместив что-то вроде этого в заголовок файла макета:
<%= javascript_include_tag 'channels/'+params[:controller] %>
вместо того, чтобы делать //= require_tree ./channels
в файле cables.js
.
но у этого есть недостаток, заключающийся в том, что вам нужно включить файл js в массив предварительной компиляции в вашем инициализаторе config\initializers\assets.rb
и перезапустить ваш сервер:
Rails.application.config.assets.precompile += %w( channels/categories.js )
Определение канала — это место, где вы ограничиваете поток, используя stream_for
с моделью, что делает идентификатор соединения уникальным, например, categories:Z2lkOi8vcmFpbHMtc3RaaaRlci9Vc2VyLzI
, а не просто categories
.
приложение/каналы/ranking_channel.rb
class RankingChannel < ApplicationCable::Channel
def subscribed
category = Category.find(params[:category_id])
stream_for category
end
...
end
Вы отправляете category_id
со страницы клиента на сервер. Здесь мы делаем это с помощью атрибута data-category-id
элемента #category
в DOM (с использованием синтаксиса jQuery, но его можно довольно легко преобразовать в обычный js).
приложение/активы/javascripts/каналы/categories.js
$( function() {
App.categories = App.cable.subscriptions.create(
{
channel: "RankingChannel",
category_id: $("#category").data('category-id')
},{
received: function(data) {
...
}
}
);
});
Таким образом, на ваш взгляд, вам нужно будет указать идентификатор категории при создании страницы:
приложение/представления/категории/show.html.erb
<div id="category" data-category-id="<%= @category.id %>">
<div class="title">My Category</div>
...
</div>
person
clairity
schedule
22.09.2016