gpt4 book ai didi

ruby-on-rails - 特定页面的Rails Actioncable

转载 作者:行者123 更新时间:2023-12-03 13:46:24 26 4
gpt4 key购买 nike

在我的项目中,我有一个模型categories,它具有一个详细 View (显示)。该 View 包含应使用actioncable进行实时更新的数据。 View 的内容/数据对于理解问题并不重要。

一个标准的设置,其中我只有一个具有硬编码ID的类别,可以很好地工作,但是现在我想使其动态化并针对特定页面,这样我就不需要打开100个订阅,我甚至不需要打开100个订阅。不在类别详细信息页面上。

第一个问题:如何仅为当前页面/类别创建连接?

第二个问题:如何获取当前类别的ID?

App.cable.subscriptions.create { channel: "RankingChannel", category_id: HOW_DO_I_GET_THIS}

我发现的唯一东西是这个,但是没有用:
https://stackoverflow.com/a/36529282/5724835

最佳答案

channel 似乎并不是针对特定页面而设计的(就像 Controller 不是针对特定页面的一样),但是您可以调整 channel 的范围(就像您尝试做的那样),以便订阅仅接收给定类别的消息。

您可以通过将以下内容放在布局文件的头部来有选择地在页面上包含 channel 的js文件:

<%= javascript_include_tag 'channels/'+params[:controller] %>

而不是在 //= require_tree ./channels文件中执行 cables.js

但这有一个缺点,要求您在 config\initializers\assets.rb初始化程序的precompile数组中包含js文件,然后重新启动服务器:
Rails.application.config.assets.precompile += %w( channels/categories.js )

channel 定义是您使用模型的 stream_for定义流范围的地方,该模型使连接ID唯一,例如 categories:Z2lkOi8vcmFpbHMtc3RaaaRlci9Vc2VyLzI而不是 categories

app/channels/ranking_channel.rb
class RankingChannel < ApplicationCable::Channel
def subscribed
category = Category.find(params[:category_id])
stream_for category
end

...

end

您将 category_id从客户端页面发送到服务器。在这里,我们通过DOM中 data-category-id元素上的 #category属性来执行此操作(使用jQuery语法,但可以很容易地转换为纯js)。

app/assets/javascripts/channels/categories.js
$( function() {
App.categories = App.cable.subscriptions.create(
{
channel: "RankingChannel",
category_id: $("#category").data('category-id')
},{
received: function(data) {
...
}
}
);
});

因此,在您的 View 中,生成页面时需要包括类别ID:

app/views/categories/show.html.erb
<div id="category" data-category-id="<%= @category.id %>">
<div class="title">My Category</div>

...

</div>

关于ruby-on-rails - 特定页面的Rails Actioncable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39597665/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com