ActionCable的理解,分三个步骤:
- create a channel,生成一个
app/channels/application_cable/products_channel.rb
文件
class ProductsChannel < ActionCable::Channel::Base
def subscribed
stream_from "your_products"
end
end
- broadcast some data
ActionCable.server.broadcast 'your_products', your_data_key: "your data"
- 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的视频