Ruby on Rails 5 Action Cable:当前模型实例的流(基于URL的订阅)

时间:2016-08-26 18:06:43

标签: ruby-on-rails-5 actioncable

我已经远程搜索了网页(包括阅读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

谢谢你的帮助!

2 个答案:

答案 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块中添加多个条件。