我已经远程搜索了网页(包括阅读ActionCable
的许多代码示例),这似乎是对一个非常基本的问题的答案。唉,我还没有解决我的问题。
假设我有一个模型Search
,我已导航到网址/searches/1
。
我还会在search.coffee
下面的javascripts/channels/
文件开头:
App.instance = App.cable.subscriptions.create 'SearchChannel'
和SearchChannel
类看起来像这样:
class SearchChannel < ApplicationCable::Channel
def subscribed
search = Search.find(params[:id])
stream_for search
end
def unsubscribed
end
end
当然,上面的代码会产生错误,因为params[id]
是nil
。
以下是我的问题:
Search
实例?SearchChannel
,例如/searches/1/results
?谢谢你的帮助!
答案 0 :(得分:1)
如果你看一下ActionCable.Subscriptions#create
的实现,可以通过两种方式调用它。
选项1(使用channelName):
App.cable.subscriptions.create 'SearchChannel'
选项2(使用渠道对象):
App.cable.subscriptions.create channel: 'SearchChannel', id: 'Best Room'
如果你在内部使用选项1,它将被转换为通道对象。
因此,如果您要在服务器端捕获id
,则需要使用第二个选项并传递id
的{{1}},然后您应该能够捕获如你所描述的那样在服务器端:
search
有关详细信息,请参阅Client-Server Interactions and Subsciptions。
答案 1 :(得分:0)
您好,如果您需要从URL访问变量以进行服务器端对连接的处理,则可以执行以下操作。在您的search.coffee.erb文件中。
string = window.location.href
cut_string = "/"
if string.indexOf(cut_string) != -1
id = string.split(cut_string)[4]
else
id = // something else
App.instance = App.cable.subscriptions.create { channel: "SearchChannel" , id: id } , ...
在您的频道文件中,您可以成功使用它。
class SearchChannel < ApplicationCable::Channel
def subscribed
search = Search.find(params[:id])
stream_for search
end
def unsubscribed
end
end
如何基于URL订阅正确的Search实例?
您可以更改并编写咖啡脚本代码,以便仅在浏览所需页面时才创建动作电缆连接。
string = window.location.href
cut_string = "/"
if string.indexOf(cut_string) != -1
id = string.split(cut_string)[4] IF BLOCK CREATE CONNECTION
App.instance = App.cable.subscriptions.create { channel: "SearchChannel" , id: id } , ...
如果我在另一个频道上,如何避免尝试订阅SearchChannel 不需要订阅的网址,例如/ searches / 1 /结果
在脚本代码的if块中添加多个条件。