Rails [求助] 关于 ActionCable 中 stream_from stream_for 函数的作用

lilijreey · 2016年08月06日 · 最后由 lilijreey 回复于 2016年08月09日 · 1676 次阅读

请问这俩函数是干啥用的? 看了半天文档没搞清楚用途. Doc http://edgeapi.rubyonrails.org/classes/ActionCable/Channel/Streams.html#method-i-stream_for

class CommentsChannel < ApplicationCable::Channel
  def follow(data)
    stream_from "comments_for_#{data['recording_id']}"
  end

  def unfollow
    stop_all_streams
  end
end

class CommentsChannel < ApplicationCable::Channel
  def subscribed
    post = Post.find(params[:id])
    stream_for post
  end
end


共收到 7 条回复

stream_for第一个参数是model, stream_from第一个参数是channel的名字

实际写一下code被坑一次就大概了解了。每当有从client来的请求,相对的server side的handler method需要给这些请求一个标记。用来标记这些request的就是stream_for 和 stream_from。

比如在/post/1,某用户回复了该文章,我们需要对在浏览该文章的所有client更新回复的列表,我们可以用 stream_for post这种形式, 其中 post是 Post Model的一个instance。 当然,如果还可以自己设定一种标记,比如update_post_#{data[:id]}这种,这里的id则是post的id,这样的话就需要用stream_from这种形式。

stream_for 只是一个方便的写法,方便根据 model 生成 channel name ,底层调用的还是 stream_from 。我大部分时候都用的 stream_from ,因为构造的 channel name 都不大规则……

stream_from 和 stream_for 都是用来标记某条连接下面的某个 stream 。ActionCable 收发信息的最小单位是 stream 。

stream_from 的参数要跟 ActionCable.server.broadcast 的第一个参数一致,这样前端才能收到广播

你在 app/assets/javascripts/cable.js 里面加一行代码启用 debug

App.cable = ActionCable.createConsumer();
ActionCable.startDebugging(); // 启用调试

,然后动手试试,看打印信息就知道,再不行就看源码。

stream_for 先把 channel 和 model 的信息拼凑成字符串(具体什么形式不清楚)作为参数,然后调用 stream_from

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册