我一直试图让rails应用程序一起替换一个经过编码的php怪物。当前的版本是从非Rails数据库中提取数据,将其放入Rails数据库,然后在视图中显示它。 db主要填充温度读数,每隔几秒钟就会添加一次。我可以在Rails中显示一个静态页面而没有任何问题但是,尝试添加ActionCable /实时数据已经证明是有问题的。大多数东西似乎都运行正常但是,当我向我的频道广播时,它似乎没有点击mychannel.coffee中的Received功能。
我的设置: 服务员 - 乘客(捆绑执行乘客开始) 乔布斯 - Resque ActionCable - Redis
通过抓取原始SQL并创建新记录的作业从legacydb导入数据。在此之后,另一个工作广播到频道。
我认为问题来自ActionCable。我发现的所有示例都需要用户输入才能触发JS。但是,我试图从服务器端严格触发事物。这份工作:
class DatabroadcastJob < ApplicationJob
queue_as :default
self.queue_adapter = :resque
def perform
ActionCable.server.broadcast 'dashboard_channel', content: render_thedata
end
private
def render_thedata
dataArr =[Data1.last, Data2.last, Data3.last]
ApplicationController.renderer.render(partial:
'dashboard/data_tables', locals: {item: dataArr})
end
end
作品。有用。我看到广播击中了dashboard_channel。但是,dashboard.coffee中的任何内容都不会被广播触发。这令人难以置信的混乱。
Dashboard.coffee
App.dashboard = App.cable.subscriptions.create "DashboardChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
# Called when there's incoming data on the websocket for this channel
alert data['content']
什么都没发生。日志显示广播,但没有任何内容命中dashboard.coffee并在浏览器中引发警报。由于所有的聊天示例,我是否以错误的方式思考这个问题?还有另一个地方我抓住广播并在仅进行服务器端更改时将其推送给订阅者吗?
如果需要任何其他信息来解决此问题,请告知我们。这个问题一直困扰着我好几天。
答案 0 :(得分:3)
首先,检查你的帧。你确定你收到了你想要的消息吗?
然后,在您的频道中,您应该为您的潜水艇设置一个ID。如果您有与模型相关的流,则可以从模型和通道生成所使用的广播。
class DashboardChannel < ApplicationCable::Channel
def subscribed
post = Post.find(params[:id])
stream_for post
end
end
然后您可以像这样广播到您的频道
DashboardChannel.broadcast_to(@post, @comment)
否则,您应该执行以下操作:
class DashboardChannel < ApplicationCable::Channel
def subscribed
stream_from 'dashboard_channel'
end
end
但这是一种不好的做法,因为您将无法定义哪个用户传输到您的服务器。
答案 1 :(得分:0)
我要为故障排除和测试咖啡/ javascript添加的一件事是console.log
是你的朋友。在整个过程中添加console.log "First step complete"
等确实有助于追踪错误发生的位置。