в рельсах с кабелем действия, не в состоянии отправить от клиента до сервера - PullRequest
0 голосов
/ 22 апреля 2019

в рельсах с кабелем действия, я не могу получить сообщение от клиента к серверу, хотя могу отправить с сервера на канал к клиенту.

Вы можете увидеть все файлы здесь, и в конце я показал их с помощью cat, пока я показываю все команды, использованные при создании программы

Глядя в awpchan_channel.rb, я подписался на def, и это работает, а команда туда будет записывать на сервер. Но def receive (data) никогда не запускается. Я написал путы там, но они не выполняются.

Но у меня есть строка в файле js, предназначенная для отправки строки с клиента на сервер. App.awpchan.send('This is a cool chat app.'); Но это не так.

У меня было это в coffeescript, но и этого не было.

конфиг / routes.rb

Rails.application.routes.draw do

mount ActionCable.server, at: '/cable'

root 'application#index'

end

приложение / контроллеры / application_controller.rb

class ApplicationController < ActionController::Base
 def index
   ActionCable.server.broadcast 'abcdstrm', 'zzz'  
 end
end

приложение / каналы / 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 / channel / 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

добавил

Применение предложения arieljuod в файле js, помещение строки отправки в тело метода 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 Ответ

1 голос
/ 22 апреля 2019

Первая проблема заключалась в том, что вы вызывали метод 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/

добавлено уточнение по штриху

А на стороне сервера вы можете сделать

def received
  puts data["message"]
end
...