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

Vad*_*dim 10 ruby-on-rails-5 actioncable

我已经远程搜索了网络(包括阅读许多代码示例ActionCable),这似乎是对一个非常基本的问题的答案.唉,我还没有解决我的问题.

假设,我有一个模型Search,我已导航到URL /searches/1.

我也有下面的search.coffee文件javascripts/channels/:

App.instance = App.cable.subscriptions.create 'SearchChannel'
Run Code Online (Sandbox Code Playgroud)

和一个SearchChannel看起来像这样的类:

class SearchChannel < ApplicationCable::Channel
  def subscribed
    search = Search.find(params[:id])
    stream_for search
  end

  def unsubscribed
  end
end
Run Code Online (Sandbox Code Playgroud)

自然地,由于上面的代码产生一个错误params[id]nil.

这是我的问题:

  • 如何Search根据URL 订阅正确的实例?
  • SearchChannel如果我在另一个不需要订阅的URL上,如何避免尝试订阅,例如/searches/1/results

谢谢你的帮助!

Dha*_*udi 0

如果您查看 的实现ActionCable.Subscriptions#create,您可以通过两种方式调用它。

选项 1(带有通道名称):

App.cable.subscriptions.create 'SearchChannel'
Run Code Online (Sandbox Code Playgroud)

选项 2(使用通道对象):

App.cable.subscriptions.create channel: 'SearchChannel', id: 'Best Room'
Run Code Online (Sandbox Code Playgroud)

如果您选择选项 1,它会在内部转换为通道对象。

因此,如果您想id在服务器端捕获,则需要使用第二个选项并传递 的idsearch那么您应该能够按照您的描述在服务器端捕获它:

class SearchChannel < ApplicationCable::Channel
  def subscribed
    search = Search.find(params[:id])
    stream_for search
  end

  def unsubscribed
  end
end
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅客户端-服务器交互和订阅。

  • 我不太确定您想通过“SearchChannel”订阅实现什么目标。但如果您需要从 ruby​​ 端捕获“@search.id”到 javascript 端,您有多种选择。选项1:当您位于“/searches/1”网址时,您可以在 JavaScript 中解析该网址,并将“id”从该网址传递到“App.cable.subscriptions.create”。选项2:在`show`模板的头部,将`id`存储在javascript中,例如: &lt;%= javascript_tag "var search_id = #{params[:id]}" %&gt; 并将`search_id`传递给` App.cable.subscriptions.create`。希望有帮助。 (2认同)