в рельсах с кабелем действия, я не могу получить сообщение от клиента к серверу, хотя могу отправить с сервера на канал к клиенту.
Вы можете увидеть все файлы здесь, и в конце я показал их с помощью 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...