我正在尝试将Rails应用程序从使用Pusher迁移到ActionCable。在服务器端代码中,这是ActionCable通道:
class PagesChannel < ApplicationCable::Channel
def subscribed
stream_from 'pages'
end
def speak(data)
ActionCable.server.broadcast('pages',data)
end
end
在客户端,这是用户代码:
const app=ActionCable.createConsumer("wss://localhost.branch.co:3000/cable");
const channel =app.subscriptions.create("PagesChannel",{
connected:()=>{
console.log("connected")
},
received:()=>{
console.log("got mail")
}
})
在官方网站https://guides.rubyonrails.org/action_cable_overview.html中提到:
然后,在Rails应用程序的其他地方,您可以通过调用broadcast来广播到这样的房间:
我解释说,这意味着在我的rails应用程序中,我可以调用ActionCable.server.broadcast('pages',data)
,它将广播给所有订阅者。你可以只在Channel类中调用它吗?如果可以,你如何从服务器端调用Channel类的方法。我能够验证我的客户端频道订阅是否连接。我甚至可以调用channel.perform("speak");
在我的JS代码从我的客户端,并有它广播到所有客户端。
我在上面的代码运行一个服务器,所有的配置,路由.rb路径都设置好了。运行服务器后,我通过bundle exec rails console
使用rails控制台,输入ActionCable.server.broadcast("pages",{})
,客户端没有收到消息,控制台没有显示错误。我的客户端在上面的代码运行。我已经确定这不是一个跨域错误。
1条答案
按热度按时间ctehm74n1#
在没有看到整个应用程序的情况下很难提供帮助,但是你应该可以从任何地方调用
ActionCable.server.broadcast('pages',data)
。我的猜测是,你没有正确配置redis,你应该验证一下。