Rails ActionCable 学习笔记

kevinhua · 2016年11月12日 · 2662 次阅读

[简单的笔记,待进一步编辑]

看着 Ruby-China 也用上了 ActionCable,然后看了一下 China RailsCasts 转载的 DHH 的教学视频,感觉讲得非常好。

其实看了一下,ActionCable 上手也非常简单,而且 Rails 还内置了 Generator,一句简单的命令就可以搞定 Scaffold 文件:

rails generate channel NAME [method method] [options]

避开技术流程简单来说,最常见的应用场景就是:

前端递交表单->Commit 并保存->通过 after-create-commit 触发任务并排队执行->服务器端将数据 (可以是渲染后的数据)broadcast->客户端接收到数据并执行

简单来分解一下:

1) Form (例如 Ruby China 的“发布新话题”表单)

2) Commit (例如 Ruby China 的 TopicsController#Create)

3) 在模型中设定 after-create-commit (例如 Ruby China 的 Topic Model)

after_create_commit { TopicBroadcastJob.perform_later self }

创建 Job 也很简单,一句简单的命令就可以搞定:

rails generate job NAME [options]

例如:

rails generate TopicBroadcastJob

5) 通过 TopicBroadcastJob,将服务器端数据 broadcast [这里就参考 DHH 视频中的例子]

class TopicBroadcastJob < ApplicationJob
  queue_as :default

  def perform(message)
    ActionCable.server.broadcast 'stream_channel', message: render_topic(topic)
  end

  private
    def render_topic(topic)
      ApplicationController.renderer.render(partial: 'topics/topic', locals: {topic: topic})
    end
end

6) 客户端接收到数据并执行,例如将接收到的数据 (可以是用新建记录渲染过的 partial)

received: (data) ->
  $('#topics').append data['topic']

当然,在使用 ActionCable 之前,还需要简单地设置:

1) 在 Routes 中添加一句:

mount ActionCable.server => '/cable'

2) 在 config 目录中,增加一个 cable.yml,大致内容如下:

development:
  adapter: async

test:
  adapter: async

production:
  adapter: redis
  url: redis://localhost:6379/1

3) 在 Layouts 头部增加一句:

<%= action_cable_meta_tag %>

4) 通过 Generator 生成前后端文件:

rails g channel stream

将在 app/assets/javascripts 中生成前端 (客户端)Coffee 文件,在 app/channels 生成后端 (服务器端文件)。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号