gpt4 book ai didi

ruby-on-rails - 如何在 Rails Controller 中调用 channel 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:00 25 4
gpt4 key购买 nike

我有一个订阅用户的 ActionCable 方法。如果开始新的 session ,我也想为用户订阅新 channel 。我想不出在 Controller 中调用 channel 方法的正确语法。

更新:问题是消息在发送时附加到聊天框,但是当发送第一条消息时,websocket 连接尚未建立,因此在用户看来好像消息没有发送(因为它没有被附加)。

channel /msgs_channel.rb

class MsgsChannel < ApplicationCable::Channel  
#This function subscribes the user to all existing convos
def subscribed
@convos = Convo.where("sender_id = ? OR recipient_id = ?", current_user, current_user)
@convos.each do |convo|
stream_from "msg_channel_#{convo.id}"
end
end

#This is a new function I wrote to subscribe the user to a new convo that is started during their session.
def subscribe(convo_id)
stream_from "msg_channel_#{convo_id}"
end
end

在我的 convos Controller 中,create 方法,我尝试了几种方法:

convos_controller.rb

def create
@convo = Convo.create!({sender_id: @sender_id, recipient_id: @recipient_id})
ActionCable.server.subscribe(@convo.id)
end

ActionCable.subscribe(@convo.id)

错误:NoMethodError(未定义的方法为 ActionCable:Module 订阅)`


ActionCable.msgs.subscribe(@convo.id)

错误:NoMethodError(ActionCable:Module 的未定义方法消息):`


  App.msgs.subscribe(@convo.id)

错误:NameError(未初始化常量 ConvosController::App):


MsgsChannel.subscribe(@convo.id)

错误:NoMethodError(未定义方法订阅' MsgsChannel:Class`


ActionCable.server.subscribe(@convo.id)

错误:NoMethodError (undefined methodsubscribe' for #):`

最佳答案

从 Controller 检索特定 channel 实例

Channel 实例与用户的 Connection 相关联。以下将用于获取 ConnectionChannel 的哈希值:

conn = ActionCable.server.connections.first { |c| c.current_user == user_id }

# subs is a hash where the keys are json identifiers and the values are Channels
subs = conn.subscriptions.instance_variable_get("@subscriptions")

(如果 Connection#current_user 不存在,则按照 the rails ActionCable overview 中第 3.1.1 节顶部的说明进行添加。)

然后您可以根据您想要的任何标准获得一个Channel。例如,您可以按类型搜索,在您的情况下是 MsgsChannelsubs 中的 json 键也可以使用,但可能更复杂。

一旦你有了这个实例,你就可以调用你想要的任何方法(在你的例子中是 MsgsChannel#subscribe)。

对这种方法的担忧

Channel 只是封装服务器端工作,这些工作将被启动以响应来自应用程序客户端的消息。让服务器调用 Channel 方法实际上相当于让服务器假装消费者发送了一条它没有发送的消息。

我建议不要这样做,而是将您想要从 ControllerChannel 中使用的任何逻辑放入共享位置的方法中。 ControllerChannel 可以根据需要直接调用此方法。

话虽这么说,但有一个痛苦的警告,那就是您需要 Channel 来调用 stream_from。不幸的是,管理流是特定于 Channel 的,尽管从根本上说它只是更新 Server 的 pubsub 信息。

我认为流管理实际上应该只需要适当的连接和带有 pubsub 的 Server。如果是这种情况,您就不必担心从应用程序的服务器端调用 Channel 方法。

如果你得到一个Channel,你应该能够更直接有效地运行stream_for,任何Channel(你可以使用subs 来自这个答案的顶部)并在其上调用 stream_for

conn = ActionCable.server.connections.first { |c| c.current_user == user_id }
MsgsChannel.new(conn, "made up id").stream_from "your_stream_name"

我自己还没有尝试过,但看起来应该可行。

关于ruby-on-rails - 如何在 Rails Controller 中调用 channel 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42679739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com