ActionCable 在多个频道中显示消息
ActionCable displaying message in multiple channels
我正在使用 ActionCable 在我的游戏室(游戏)中实现聊天。
到目前为止,这是我的代码:
app/channels/game_channel.rb:
class GameChannel < ApplicationCable::Channel
def subscribed
stream_from "game_channel_#{params[:game]}"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def speak (data)
ActionCable.server.broadcast("game_channel_#{params[:game]}", data)
end
end
app/assets/javascripts/channels/game.js.erb:
<% Game.all.each do |game| %>
App['game' + <%=game.id%>] = App.cable.subscriptions.create({channel: 'GameChannel', game: <%= game.id %>}, {
received: function(data) {
alert(message)
},
setGameId: function(gameId) {
this.gameId = gameId
},
speak: function(data) {
this.perform('speak'), message => data['message']
}
});
<% end %>
当我发送命令时:
App.game1.speak (message: "Test1", player: 1, game:1)
--> 警报消息:“测试 1”@ 游戏 1。
App.game2.speak (message: "Hello", player: 2, game:2)
--> 提醒消息“Hello”@Game 2,AND @Game 1 它再次提醒消息:“Test1”。
如何解决这个问题,只显示@更新游戏的消息,而不在其他游戏房间更新?
服务器正在显示:
17:03:01 web.1 | GameChannel is transmitting the subscription confirmation
17:03:01 web.1 | GameChannel is streaming from game_channel_2
17:03:01 web.1 | GameChannel is transmitting the subscription confirmation
17:03:01 web.1 | GameChannel is streaming from game_channel_1
17:03:06 web.1 | GameChannel#speak
17:03:06 web.1 | [ActionCable] Broadcasting to game_channel_1: {"action"=>"speak"}
17:03:06 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_1)
17:03:06 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_1)
17:03:11 web.1 | GameChannel#speak
17:03:11 web.1 | [ActionCable] Broadcasting to game_channel_2: {"action"=>"speak"}
17:03:11 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_2)
17:03:11 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_2)
这是我的解决方案(我不知道,但似乎不对),有什么意见吗?
我在 game.js.erb 中添加了以下条件:
<% Game.all.each do |game| %>
App['game' + <%= game.id %>] = App.cable.subscriptions.create({channel: 'GameChannel', game: <%= game.id %>}, {
received: function(data) {
if (game == <%= game.id %>) {
alert ('message: ' + message + '; game: ' + <%= game.id %> + '; game: ' + game);
}},
setGameId: function(gameId) {
this.gameId = gameId
},
speak: function(data) {
this.perform('speak')
}
});
<% end %>
基本上我是在比较发送的游戏和游戏房间id。
我正在使用 ActionCable 在我的游戏室(游戏)中实现聊天。 到目前为止,这是我的代码:
app/channels/game_channel.rb:
class GameChannel < ApplicationCable::Channel
def subscribed
stream_from "game_channel_#{params[:game]}"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def speak (data)
ActionCable.server.broadcast("game_channel_#{params[:game]}", data)
end
end
app/assets/javascripts/channels/game.js.erb:
<% Game.all.each do |game| %>
App['game' + <%=game.id%>] = App.cable.subscriptions.create({channel: 'GameChannel', game: <%= game.id %>}, {
received: function(data) {
alert(message)
},
setGameId: function(gameId) {
this.gameId = gameId
},
speak: function(data) {
this.perform('speak'), message => data['message']
}
});
<% end %>
当我发送命令时:
App.game1.speak (message: "Test1", player: 1, game:1)
--> 警报消息:“测试 1”@ 游戏 1。
App.game2.speak (message: "Hello", player: 2, game:2)
--> 提醒消息“Hello”@Game 2,AND @Game 1 它再次提醒消息:“Test1”。
如何解决这个问题,只显示@更新游戏的消息,而不在其他游戏房间更新?
服务器正在显示:
17:03:01 web.1 | GameChannel is transmitting the subscription confirmation
17:03:01 web.1 | GameChannel is streaming from game_channel_2
17:03:01 web.1 | GameChannel is transmitting the subscription confirmation
17:03:01 web.1 | GameChannel is streaming from game_channel_1
17:03:06 web.1 | GameChannel#speak
17:03:06 web.1 | [ActionCable] Broadcasting to game_channel_1: {"action"=>"speak"}
17:03:06 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_1)
17:03:06 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_1)
17:03:11 web.1 | GameChannel#speak
17:03:11 web.1 | [ActionCable] Broadcasting to game_channel_2: {"action"=>"speak"}
17:03:11 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_2)
17:03:11 web.1 | GameChannel transmitting {"action"=>"speak"} (via streamed from game_channel_2)
这是我的解决方案(我不知道,但似乎不对),有什么意见吗? 我在 game.js.erb 中添加了以下条件:
<% Game.all.each do |game| %>
App['game' + <%= game.id %>] = App.cable.subscriptions.create({channel: 'GameChannel', game: <%= game.id %>}, {
received: function(data) {
if (game == <%= game.id %>) {
alert ('message: ' + message + '; game: ' + <%= game.id %> + '; game: ' + game);
}},
setGameId: function(gameId) {
this.gameId = gameId
},
speak: function(data) {
this.perform('speak')
}
});
<% end %>
基本上我是在比较发送的游戏和游戏房间id。