Rails ActionCable 学习笔记

kevinhua · 发布于 2016年11月12日 · 959 次阅读
21

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

看着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生成后端(服务器端文件)。

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