尝试使用ActionCable时,Rails 5.0.0.beta2中的应用程序出现服务器问题.
使用localhost:3000可以正常工作,因为这是大多数ActionCable默认的.但是,如果我尝试在端口3001上运行rails服务器,它会给我Request origin not allowed: http://localhost:3001
ActionCable文档提到使用类似的东西ActionCable.server.config.allowed_request_origins = ['http://localhost:3001'],如果我把它放入其中对我有用config.ru
但这似乎是一个非常奇怪的地方.我觉得它应该能够进入初始化文件或我的development.rb环境配置文件.
为了进一步证明我应该允许它进入那里,该设置ActionCable.server.config.disable_request_forgery_protection = true可以忽略请求源,即使我将它包含在development.rb中也是如此.
为什么会ActionCable.server.config.disable_request_forgery_protection在development.rb中工作,但ActionCable.server.config.allowed_request_origins不能(但在config.ru中工作)?
这不是一个紧迫的问题,因为我有几种选择作为解决方法.我只是想知道我是否遗漏了一些明显的关于我认为这应该如何工作的东西.
我可以在控制器中使用以下代码,但不能在控制台中使用(两个开发环境).我正在使用Rails 5.0.0.beta2.
ActionCable.server.broadcast 'example_channel', message: '<p>Test</p>'
Run Code Online (Sandbox Code Playgroud)
控制台:
>> ActionCable.server.broadcast 'example_channel', message: '<p>Test</p>'
[ActionCable] Broadcasting to example_channel: {:message=>"<p>Test</p>"}
=> []
Run Code Online (Sandbox Code Playgroud)
我怎样才能在控制台中使用它?
我需要向我的Rails应用添加实时通知.以下是我发现的不同架构.
问题:
我有一个Rails 5应用程序,Action Cable用于websocket功能.
在我的开发环境中,一切都按预期工作,浏览器客户端成功连接到Action Cable通道.
在我的生产环境Action Cable中,某些时候正在工作,但突然停止运行,没有任何明显的原因.
如果我在我的开发机器上运行应用程序时更改RAILS_ENV为production正常Action Cable工作.在实际的生产机器上运行应用程序时似乎有些不同,尽管基本环境是相同的.
我在Chrome控制台中看到的具体错误:
mydomain.com/:1 WebSocket connection to 'wss://mydomain.com/cable' failed: WebSocket is closed before the connection is established.我在其他浏览器中遇到类似的错误,因此它似乎与浏览器无关.我在测试时禁用了任何广告拦截器以确保它们不会干扰.
Development.rb ENV相关设置:
config.action_cable.url = "ws://localhost:#{port}/cable"
Run Code Online (Sandbox Code Playgroud)
Production.rb ENV相关设置:
hostname = ENV.fetch('HOSTNAME')
port = ENV.fetch('PORT')
base_url = "#{hostname}:#{port}"
config.action_cable.url = "wss://#{hostname}/cable"
config.action_cable.allowed_request_origins = ["https://#{base_url}", "https://#{hostname}"]
Run Code Online (Sandbox Code Playgroud)
我Puma用作网络服务器.Web服务器提供安装了有效证书的SSL连接.在生产机器上,Puma在端口上为应用程序提供服务,3000但这会转发到443路由器中的端口.
在我的开发机器和生产中运行应用程序的唯一显着区别是使用生产SSL.
我使用ActionCable创建了以下内容,但无法接收任何正在广播的数据.
评论频道:
class CommentsChannel < ApplicationCable::Channel
def subscribed
comment = Comment.find(params[:id])
stream_for comment
end
end
Run Code Online (Sandbox Code Playgroud)
JavaScript:
var cable = Cable.createConsumer('ws://localhost:3000/cable');
var subscription = cable.subscriptions.create({
channel: "CommentsChannel",
id: 1
},{
received: function(data) {
console.log("Received data")
}
});
Run Code Online (Sandbox Code Playgroud)
它连接正常,我可以在日志中看到以下内容:
CommentsChannel is streaming from comments:Z2lkOi8vdHJhZGUtc2hvdy9FdmVudC8x
Run Code Online (Sandbox Code Playgroud)
然后我广播到那个流:
ActionCable.server.broadcast "comments:Z2lkOi8vdHJhZGUtc2hvdy9FdmVudC8x", { test: '123' }
Run Code Online (Sandbox Code Playgroud)
问题是received永远不会调用该函数.难道我做错了什么?
注意:我正在使用actioncablenpm包从BackboneJS应用程序连接.
我使用Rails 5 beta 1和ActionCable构建了一个非常简单的应用程序,以显示用户何时联机并让他们相互发送消息.
现在,我基本上想采取ActionCable的客户端部分,在另一个应用程序(不在 Rails 5上运行)的上下文中实现它,并将其与第一个应用程序连接以发送和接收数据(例如在线)用户或消息的状态).
为了从第二个应用程序发送数据,我假设,我可以简单地发出一个AJAX POST请求.问题是:如何从我的第二个应用程序订阅第一个应用程序的开放连接?
或者甚至:如何通过API从另一个应用程序订阅我的Rails应用程序的ActionCable连接?
我的猜测是,我基本上想在我的第二个应用中以某种方式包含这个coffeescript:
App.appearance = App.cable.subscriptions.create "AppearanceChannel",
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) ->
# ...
Run Code Online (Sandbox Code Playgroud) 我整天都被困在这一天.我有David Heinemeier Hansson工作正常的非常简单的ActionCable示例应用程序(聊天应用程序)(https://www.youtube.com/watch?v=n0WUjGkDFS0).
我试图用iPhone应用程序点击websocket连接.我连接时能够接收ping ws://localhost:3000/cable,但我不太确定如何从javascript上下文之外订阅频道.
我使用ActionCable实现了一个实时聊天系统.它可以工作,但我不断从Rollbar获取/cable生产中的端点(Heroku)的异常通知.
2017-07-18T15:36:54.738588+00:00 heroku[router]: at=info method=GET path="/cable?user_id=63191&client=Gc-CvUfsgAW70KMpIBX25A&access_token=MoBTM2jF9wTwqblMsXQcVA" host=my-api.herokuapp.com request_id=b6cc263c-19e4-4207-8ce4-65ed6a130133 fwd="61.55.27.1" dyno=web.1 connect=0ms service=1727122ms status=101 bytes=22232 protocol=https
Run Code Online (Sandbox Code Playgroud)
请注意,它花了1727122ms.如果websocket处于活动状态,那就不足为奇了,但即使客户端已停止执行任何操作,它似乎也会保持打开状态.我是否在ActionCable配置错误,或者这是预期的?我应该在Rollbar中禁止错误通知吗?
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
#puts params[:auth_token]
self.current_user = find_verified_user
logger.add_tags 'ActionCable', current_user.name
end
end
end
Run Code Online (Sandbox Code Playgroud)
我不使用web作为动作电缆的终点,所以我想使用auth_token进行身份验证.默认情况下,操作电缆使用会话用户标识进行验证 如何通过params连接方法?
ActionCable在生产中不起作用.适用于开发,但不适用于生产.
在Ubuntu 14.04上使用Puma运行Nginx.我已经检查过redis-server已启动并正在运行.
Rails -v 5.0.0.1
production.log:
INFO -- : Started GET "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
ERROR -- : Failed to upgrade to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: close, HTTP_UPGRADE: )
INFO -- : Finished "/cable/"[non-WebSocket] for 178.213.184.193 at 2016-11-25 14:55:39 +0100
Run Code Online (Sandbox Code Playgroud)
客户要求:
GET ws://mityakoval.com/cable HTTP/1.1
Host: mityakoval.com
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://mityakoval.com
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36
Accept-Encoding: gzip, deflate, …Run Code Online (Sandbox Code Playgroud)