3

Rails 5 と ActionCable を使用して簡単なチャットを作成しました。ここには、単純な「チャット」チャネルが 1 つあります。

チャネル サブスクリプションとメッセージ ブロードキャストを動的にして、チャット チャネルを作成し、メッセージが適切なチャネルに送信されるようにするにはどうすればよいですか?

残念ながら、これのコード例は1つも見つかりません。

アップデート

下の答えは正しいです。また、レールガイドで言及されていることもわかりました。http://edgeguides.rubyonrails.org/action_cable_overview.html#client-server-interactions-subscriptions以前は存在しなかったとは思わないでください

4

1 に答える 1

13

でサブスクリプションを作成する際に roomId を渡しますjavascripts/channels/room.js

MakeMessageChannel = function(roomId) {
  // Create the new room channel subscription
  App.room = App.cable.subscriptions.create({
    channel: "RoomChannel",
    roomId: roomId
  }, {
    connected: function() {},
    disconnected: function() {},
    received: function(data) {
      return $('#messages').append(data['message']);
    },
    speak: function(message, roomId) {
      return this.perform('speak', {
        message: message,
        roomId: roomId
      });
    }
  });

  $(document).on('keypress', '[data-behavior~=room_speaker]', function(event) {
    if (event.keyCode === 13) {
      App.room.speak(event.target.value, roomId);
      event.target.value = "";
      event.preventDefault();
    }
    return $('#messages').animate({
      scrollTop: $('#messages')[0].scrollHeight
    }, 100);
  });
};

channels/room_channel.rbサブスクリプション作成のパラメーターとして使用できるようになり、speak アクションも正しいデータで呼び出されました。

  def subscribed
    stream_from "room_channel_#{params[:roomId]}"
  end

  def speak(data)
     Message.create! text: data['message'], room_id: data['roomId']
  end

そして、ジョブからブロードキャストしている場合:

  def perform(message)
    ActionCable.server.broadcast "room_channel_#{message.room_id}", message: render_message(message)
  end
于 2016-05-01T07:35:16.357 に答える