use*_*421 6 ruby-on-rails ruby-on-rails-5 actioncable
我能够成功设置ActionCable,收听频道,验证请求等等.但是,在创建后尝试连接到频道时,我遇到了一个奇怪的错误(很难解释,见下文)
我有一个设置,一个配置文件有一个墙,墙上有很多帖子.每个帖子都有自己的频道,墙本身也有自己的频道.在墙上创建帖子时,会通过ActionCable进行更新:
# Wall's Cable Channel
class WallsChannel < ApplicationCable::Channel
def subscribed
profile = Profile.find_by_id params[:id]
if ability.can? :subscribe, profile
stream_from "Wall(#{profile.id})"
else
reject
end
end
end
# Broadcasting to the wall
ActionCable.server.broadcast 'Wall(:id:)', { :data: }
# Client Side
GlobalCable.cable.subscriptions.create({channel: 'WallsChannel', id :id: }, {
received: function(data) {
// do stuff with a new post on a wall
}
});
Run Code Online (Sandbox Code Playgroud)
我简化了它,但这可以按预期工作.创建新帖子时,墙上频道会被触发,客户端会收到帖子和所有商品.
问题是连接广播的新帖子.当我去听新帖子时,它无法从数据库中获取帖子:
# Posts Cable Channel
class PostsChannel < ApplicationCable::Channel
def subscribed
post = Post.find_by_id params[:id]
if ability.can? :subscribe, post
stream_from "Post({#{post.id}})"
else
reject
end
end
end
# Client side
GlobalCable.cable.subscriptions.create({ channel: 'PostsChannel', id: id }, {
received: function(data) {
// do stuff
}
});
Run Code Online (Sandbox Code Playgroud)
具体来说,订阅的PostsChannel会被正确的id调用,但是当它去抓取帖子时:
post = Post.find_by_id params[:id]
# SQL that is generated
# SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = :id: LIMIT 1
# ^ Always returns null even though we just created the post
Run Code Online (Sandbox Code Playgroud)
无论发生什么,它总是返回null.换句话说,即使100%存在,它也无法从数据库中获取Post.
如果我已经在墙上有几个帖子,他们就能够成功连接.仅当通过ActionCable创建和广播帖子时,才能在数据库中找到它.如果我重新加载页面,我们刚创建的帖子就可以了.不确定为什么新的广播帖子没有在数据库中找到
您是否在控制器中设置了这两个广播?
ActionCable.server.broadcast 'Post(:id:)', { :data: }
Run Code Online (Sandbox Code Playgroud)
否则你可以从
"Wall(#{profile.id})"
Run Code Online (Sandbox Code Playgroud)
并在接收到数据后添加逻辑。