在带操作电缆的导轨中,尽管我可以从服务器发送到客户端,但是我无法从客户端到服务器收到消息。
您可以在这里看到所有文件,最后我用cat显示了它们,因为我显示了程序制作中使用的所有命令
查看awpchan_channel.rb,我已经有def订阅,可以正常工作,那里的puts命令将写入服务器。但是def receive(data)永远不会运行。我在那儿写了一个看跌期权,它没有执行。
但是我在js文件中确实有一行,该行旨在将字符串从客户端发送到服务器。 App.awpchan.send('This is a cool chat app.');
却没有这样做。
我在咖啡脚本中确实有它,但是那也没有。
config / routes.rb
Rails.application.routes.draw do
mount ActionCable.server, at: '/cable'
root 'application#index'
end
app / controllers / application_controller.rb
class ApplicationController < ActionController::Base
def index
ActionCable.server.broadcast 'abcdstrm', 'zzz'
end
end
app / channels / awpchan_channel.rb
class AwpchanChannel < ApplicationCable::Channel
def subscribed
stream_from "abcdstrm"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def receive(data)
puts "RECEIVE BY SERVER"
end
end
app / assets / javascripts / channels / awpchan.coffee (我将其文件名和扩展名重命名为 oldawpchan.oldcoffee ,因为我没有使用它,而是使用theawpchan.js)
App.awpchan = App.cable.subscriptions.create "AwpchanChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
# Called when there's incoming data on the websocket for this channel
alert(data)
App.awpchan.send 'This is a cool chat app.'
app / assets / javascripts / theawpchan.js
App.awpchan = App.cable.subscriptions.create("AwpchanChannel", {
connected: function() {},
disconnected: function() {},
received: function(data) {
return alert(data);
}
});
App.awpchan.send('This is a cool chat app.');
// http://js2.coffee/
app / views / application / index.html.erb (空白)
这是我创建程序的方式
~/rubymac$ cd channeltests
~/rubymac/channeltests$ mkdir channeltest1
~/rubymac/channeltests$ cd channeltest1
~/rubymac/channeltests/channeltest1$ rails new . >nul
~/rubymac/channeltests/channeltest1$ vi config/routes.rb
~/rubymac/channeltests/channeltest1$ cat config/routes.rb
Rails.application.routes.draw do
mount ActionCable.server, at: '/cable'
root 'application#index'
end
~/rubymac/channeltests/channeltest1$ mkdir app/views/application
~/rubymac/channeltests/channeltest1$ touch app/views/application/index.html.erb
~/rubymac/channeltests/channeltest1$ vi app/controllers/application_controller.rb
~/rubymac/channeltests/channeltest1$ cat app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def index
ActionCable.server.broadcast 'abcdstrm', 'zzz'
end
end
~/rubymac/channeltests/channeltest1$ rails generate channel awpchan
Running via Spring preloader in process 4020
create app/channels/awpchan_channel.rb
identical app/assets/javascripts/cable.js
create app/assets/javascripts/channels/awpchan.coffee
~/rubymac/channeltests/channeltest1$ vi app/channels/awpchan_channel.rb
~/rubymac/channeltests/channeltest1$ cat app/channels/awpchan_channel.rb
class AwpchanChannel < ApplicationCable::Channel
def subscribed
stream_from "abcdstrm"
end
def unsubscribed
# Any cleanup needed when channel is unsubscribed
end
def receive(data)
puts "RECEIVE BY SERVER"
end
end
~/rubymac/channeltests/channeltest1$ vi app/assets/javascripts/channels/awpchan.coffee
~/rubymac/channeltests/channeltest1$ cat app/assets/javascripts/channels/awpchan.coffee
App.awpchan = App.cable.subscriptions.create "AwpchanChannel",
connected: ->
# Called when the subscription is ready for use on the server
disconnected: ->
# Called when the subscription has been terminated by the server
received: (data) ->
# Called when there's incoming data on the websocket for this channel
alert(data)
App.awpchan.send 'This is a cool chat app.'
~/rubymac/channeltests/channeltest1$ cd app/assets/javascripts/channels/
~/rubymac/channeltests/channeltest1/app/assets/javascripts/channels$ mv awpchan.coffee oldawpchan.oldcoffee
~/rubymac/channeltests/channeltest1/app/assets/javascripts/channels$ vi oldawpchan.oldcoffee
~/rubymac/channeltests/channeltest1/app/assets/javascripts/channels$ vi theawpchan.js
~/rubymac/channeltests/channeltest1/app/assets/javascripts/channels$ cat theawpchan.js
App.awpchan = App.cable.subscriptions.create("AwpchanChannel", {
connected: function() {},
disconnected: function() {},
received: function(data) {
return alert(data);
}
});
App.awpchan.send('This is a cool chat app.');
// http://js2.coffee/
~/rubymac/channeltests/channeltest1/app/assets/javascripts/channels$ cd ../../../
~/rubymac/channeltests/channeltest1/app$ cd ..
~/rubymac/channeltests/channeltest1$ rails s
=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.5.0-p0), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
Started GET "/" for 127.0.0.1 at 2019-04-21 23:40:55 +0100
Processing by ApplicationController#index as HTML
[ActionCable] Broadcasting to abcdstrm: "zzz"
Rendering application/index.html.erb within layouts/application
Rendered application/index.html.erb within layouts/application (1.5ms)
Completed 200 OK in 469ms (Views: 430.1ms | ActiveRecord: 0.0ms)
Started GET "/cable" for 127.0.0.1 at 2019-04-21 23:41:25 +0100
Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2019-04-21 23:41:25 +0100
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
AwpchanChannel is transmitting the subscription confirmation
AwpchanChannel is streaming from abcdstrm
已添加
在js文件中应用arieljuod的建议,将发送行置于connect方法的主体内。这样就不会太早发送邮件。
这可以改善事情,现在我收到此消息
在服务器说完之后
AwpchanChannel is transmitting the subscription confirmation
AwpchanChannel is streaming from abcdstrm
现在出现此错误(这是send命令执行时的错误)
Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"AwpchanChannel\"}", "data"=>"\"This is a cool chat app.\""}) [NoMethodError - undefined method `except' for "This is a cool chat app.":String]: /usr/local/lib/ruby/gems/2.5.0/gems/actionc...
答案 0 :(得分:1)
第一个问题是您在正确初始化通道之前调用了send
方法,请等待它首先连接。
第二件事是send
方法期望一个带有参数名称的对象,以便服务器可以通过某种方式识别它:
App.awpchan.send({message: 'This is a cool chat app.'});
App.awpchan = App.cable.subscriptions.create("AwpchanChannel", {
connected: function() {
App.awpchan.send({message: 'This is a cool chat app.'});
},
disconnected: function() {},
received: function(data) {
return alert(data);
}
});
// http://js2.coffee/
添加了barlop的详细说明
您可以在服务器端
def received
puts data["message"]
end