rails 5-通过ActionCable为每个对话创建频道

狮子座

我是Rails的新开发人员,并且开始在Rails 5中使用ActionCable创建聊天应用程序。

问题是Internet上有很多使用ActionCable的聊天示例,但是它们都非常简单。他们创建了一个频道,连接到该频道的所有用户都可以发送或读取其他人的消息。

例如,他们创建了一个聊天频道,如下所示:

class ChatChannel < ApplicationCable::Channel
  def subscribed
    stream_from 'messages'
  end

  def speak(data)
    ActionCable.server.broadcast('messages',
      message: render_message(data['message']))
  end

  private

  def render_message(message)
    ApplicationController.render(partial: 'messages/message',
                                 locals: { message: message })
  end
end

在客户端,他们连接到该渠道

App.chat = App.cable.subscriptions.create "ChatChannel",
  received: (data) ->
    $('#messages').append(data.message)

  speak: (msg) ->
    @perform 'speak', message: msg

如何为2位用户之间的每次对话创建一个频道?

安德烈斯·戴维阿

唯一改变的是您订阅的频道。在这种情况下,应该进行特定的对话。您可能会遇到这样的事情:

messages.coffee

$(document).on "turbolinks:load", ->
  messages = $("#messages-list")

  App.Messages = App.cable.subscriptions.create {
    channel: "MessagesChannel"
    # You can grab the conversation id as a data attribute from the messages container of your conversation and pass it as a parameter to the channel
    conversation_id: messages.data("conversation-id")
  },

  connected: ->

  disconnected: ->
    # Called when the subscription has been terminated by the server

  received: (data) ->
    messages.append(data["message"])
    $("#new_message")[0].reset();

messages_channel.rb

class MessagesChannel < ApplicationCable::Channel
  def subscribed
    stream_from "conversation_#{params['conversation_id']}_channel"
  end

  def unsubscribed
    # Any cleanup needed when channel is unsubscribed
  end
end

messages_controller.rb

# You can have something like this in your create action
def create
    message = @conversation.messages.build(message_params)
    message.user = current_user
    message.save

    ActionCable.server.broadcast "conversation_#{message.conversation.id}_channel",
      message: render_message(message)

    head :ok
end

private

  def set_conversation
    @conversation = Conversation.find(params[:conversation_id])
  end

  def render_message(message)
    render partial: "messages/message", locals: { message: message }
  end

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

rails 5-通过ActionCable为每个对话创建频道

来自分类Dev

消耗Rails 5 ActionCable

来自分类Dev

带有对话的Rails5 ActionCable聊天

来自分类Dev

Rails 5 ActionCable通过URL参数建立流

来自分类Dev

如何理解Rails5的actioncable

来自分类Dev

Rails 5 ActionCable 修改 confirm_subscription

来自分类Dev

Rails 5 ActionCable WebSockets不返回状态为101升级响应的升级标头

来自分类Dev

通过API创建资源时,Rails 5 ActiveRecord :: SerializationTypeMismatch

来自分类Dev

如何在Rails 5中创建API?

来自分类Dev

似乎sidekiq在Rails5中不支持actioncable?

来自分类Dev

Rails 5 ActionCable 使用 DIV 工作,但不使用 UL

来自分类Dev

通过代理的Rails 5.0.0 Actioncable

来自分类Dev

Rails 5通过整数值获取枚举键

来自分类Dev

Rails 5 Postgresql has_many通过关联

来自分类Dev

如何在 Rails 5 中查询“有很多通过”关系

来自分类Dev

Rails 5-设置为空时的字段值

来自分类Dev

Rails5添加引用以创建一对多

来自分类Dev

从Rails 5中的“创建”功能获取JSON响应

来自分类Dev

在 Rails 5 中动态创建控制器动作

来自分类Dev

在 Rails 5 中创建模型的新记录时出错

来自分类Dev

Rails 5:添加循环创建方法并每次递增1

来自分类常见问题

Rails 5:ActiveRecord或查询

来自分类Dev

Rails 5和ActiveModelSerializers

来自分类Dev

rails 5 collection select

来自分类Dev

Rails 5 HABTM关联

来自分类Dev

Rails 5-CanCan

来自分类Dev

Rails 5的默认行为

来自分类Dev

Rails 5 - ExecJS::RuntimeError

来自分类Dev

Ruby on Rails 5