标签: actioncable

不允许请求源:http:// localhost:3001使用Rails5和ActionCable时

尝试使用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中工作)?

这不是一个紧迫的问题,因为我有几种选择作为解决方法.我只是想知道我是否遗漏了一些明显的关于我认为这应该如何工作的东西.

ruby-on-rails ruby-on-rails-5 actioncable

34
推荐指数
2
解决办法
1万
查看次数

来自控制台的ActionCable.server.broadcast

我可以在控制器中使用以下代码,但不能在控制台中使用(两个开发环境).我正在使用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)

我怎样才能在控制台中使用它?

ruby-on-rails ruby-on-rails-5 actioncable

32
推荐指数
1
解决办法
9017
查看次数

Rails与实时通知架构

我需要向我的Rails应用添加实时通知.以下是我发现的不同架构.

1.导轨+ Socket.io + Redis的:如所建议的在该中,具有以下结构:

Rails + Socket.io + Redis

  • Pro:清理,如果Socket.io关闭,数据不会丢失
  • Con:介绍几种技术(加强可维护性)

2. Rails + Socket.io:使Rails成为一个Socket.io客户端,就像这个repo似乎做的那样:https://github.com/lyondhill/socket.io-ruby-client

Rails + Socket.io

  • :直截了当
  • 骗局:依靠不受欢迎的图书馆

3. Ruby Faye:http://faye.jcoglan.com/ruby.html

  • :100%Ruby
  • Con:由于需要外部应用程序,Socket.io现在比Faye更像行业标准.

4. ActionController :: Live:http://edgeapi.rubyonrails.org/classes/ActionController/Live.html

  • Pro:应用程序中的Rails
  • 骗局:太不成熟了

问题:

  • 现在有没有一种标准的方式(我已经错过了)?
  • 对我的比较有任何想法(希望这不会被关闭)?

sockets ruby-on-rails websocket actioncable

25
推荐指数
1
解决办法
2907
查看次数

ActionCable不再在生产环境中工作

我有一个Rails 5应用程序,Action Cable用于websocket功能.

在我的开发环境中,一切都按预期工作,浏览器客户端成功连接到Action Cable通道.

在我的生产环境Action Cable中,某些时候正在工作,但突然停止运行,没有任何明显的原因.

如果我在我的开发机器上运行应用程序时更改RAILS_ENVproduction正常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.

ssl ruby-on-rails websocket puma actioncable

23
推荐指数
1
解决办法
2932
查看次数

ActionCable未接收数据

我使用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应用程序连接.

ruby-on-rails actioncable

20
推荐指数
1
解决办法
6505
查看次数

如何使用ActionCable作为API

我使用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)

api ruby-on-rails ruby-on-rails-5 actioncable

19
推荐指数
2
解决办法
9727
查看次数

从iOS应用程序连接到ActionCable

我整天都被困在这一天.我有David Heinemeier Hansson工作正常的非常简单的ActionCable示例应用程序(聊天应用程序)(https://www.youtube.com/watch?v=n0WUjGkDFS0).

我试图用iPhone应用程序点击websocket连接.我连接时能够接收ping ws://localhost:3000/cable,但我不太确定如何从javascript上下文之外订阅频道.

ruby-on-rails websocket ruby-on-rails-5 actioncable

17
推荐指数
2
解决办法
5467
查看次数

Heroku上的ActionCable服务器响应时间

我使用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中禁止错误通知吗?

ruby-on-rails heroku actioncable rollbar

17
推荐指数
1
解决办法
317
查看次数

将auth_token发送给ActionCable进行身份验证

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连接方法?

ruby-on-rails-5 actioncable

16
推荐指数
4
解决办法
7400
查看次数

ActionCable - 无法在生产中升级到WebSocket

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)

ruby ruby-on-rails nginx ruby-on-rails-5 actioncable

16
推荐指数
4
解决办法
9277
查看次数