ActionCable

ActionCable的理解,分三个步骤:

  1. create a channel,生成一个app/channels/application_cable/products_channel.rb文件
 class ProductsChannel < ActionCable::Channel::Base
    def subscribed
      stream_from "your_products"
    end
 end
  1. broadcast some data
 ActionCable.server.broadcast 'your_products', your_data_key: "your data"
  1. receive the data,在app/assets/javascripts/products.coffee文件中添加
  App.productsChannel =
     App.cable.subscriptions.create {channel: "ProductsChannel"},
       received: (data) -> $(".store #main").html(data['your_data_key]')

其中:

  • product.coffee文件中的channel: "ProductsChannel"需要对应products_channel文件中的类名ProdcutsChannel
  • products_channel文件中的stream_from "your_products"要对应ActionCable.server.broadcast 'your_products', your_data_key: "your data"中的your_products
  • product.coffee文件中的received: (data) -> $(".store #main").html(data['your_data_key'])要对应ActionCable.server.broadcast 'your_products', your_data_key: "your data"中的your_data_key

ActionCable可以跟ActionJob一起使用,把broadcast data这一步放在job中,还可以把job放在model的回调方法中。使得整个流程顺畅,广播数据也不会造成堵塞。


  • 可以使用rails generate channel channel_name [method]来生成channel,比如生成channel的时候,还生成了一个叫speak的方法。
  • 在xxx_channel的coffee文件中,@perform speak, data_key: your_pass_data会去调用xxx_channel.rb文件中的speak方法,同时可以将view页面中的内容传递给服务器。例如在speak方法,可以写Message.create! content: your_pass_data['data_key']来创建数据到数据库.

routes.rb文件中增加一行:mount ActionCable.server => '/cable'
目的是让cable server在rails进程内。
在development环境下,不加这一行似乎没有什么影响,不知道在生产环境这一行是否必须要加?


写得很乱,很零散。具体可以看DHH的视频

你可能感兴趣的:(ActionCable)