Rails 5:ActionCable和db未同步

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创建和广播帖子时,才能在数据库中找到它.如果我重新加载页面,我们刚创建的帖子就可以了.不确定为什么新的广播帖子没有在数据库中找到

Jer*_*emy 0

您是否在控制器中设置了这两个广播?

ActionCable.server.broadcast 'Post(:id:)', { :data: }
Run Code Online (Sandbox Code Playgroud)

否则你可以从

"Wall(#{profile.id})"
Run Code Online (Sandbox Code Playgroud)

并在接收到数据后添加逻辑。