在带操作电缆的导轨中,无法从客户端发送到服务器

时间:2019-04-21 22:43:07

标签: ruby-on-rails actioncable

在带操作电缆的导轨中,尽管我可以从服务器发送到客户端,但是我无法从客户端到服务器收到消息。

您可以在这里看到所有文件,最后我用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...

1 个答案:

答案 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