我知道Heroku只允许2个端口,即80和443用于连接,这就是为什么你需要为WebSockets运行一个单独的服务器。我遇到了这个指南,它声称允许您在同一台服务器上运行两个进程。我还改变了这一行:if Faye::WebSocket.websocket?(env)
:
根据用户的评论::WebSocket::Driver.websocket?(env)
,因为我没有使用Faye。
然而,我得到错误未初始化常数ChatActionCable (NameError)。我试过这一页的指南,但一无所获。
我的应用程序。Rb文件看起来像这样:
require_relative 'boot'
require 'rails/all'
module Third
class Application < Rails::Application
config.autoload_paths += %W(#{config.root}/lib)
end
end
TIA。
Update:指南的问题是中间件文件的名称。我将其更改为chat_action_cable.rb
,至少中间件开始运行。现在的问题在于::WebSocket::Driver.websocket?(env)
行为未初始化常量,NameError。
我认为网上的例子是不完整的。
中间件应该继承自ActionCable::Connection::WebSocket
class ChatActionCable < ActionCable::Connection::WebSocket
def initialize(app, options={})
@app = app
end
def call(env)
if ::WebSocket::Driver.websocket?(env)
ActionCable.server.call(env)
else
@app.call(env)
end
end
end
对于那些正在寻找如何使用Heroku设置ActionCable的人,这里有一个一步一步的指南:
创建中间件文件:/app/middleware/chat_action_cable.rb
class ChatActionCable < ActionCable::Connection::WebSocket
def initialize(app, options={})
@app = app
end
def call(env)
if ::WebSocket::Driver.websocket?(env)
ActionCable.server.call(env)
else
@app.call(env)
end
end
end
设置在config:
/config/environments/production.rb
config.middleware.use ChatActionCable
config.web_socket_server_url = "wss://your-heroku-app.herokuapp.com/"
在heroku上设置redis插件(它应该已经包含):
heroku plugins:install heroku-redis (in case)
创建一个新的redis heroku实例:
heroku addons:create heroku-redis:hobby-dev -a young-home-19338
(replace young-home-19338 with your instance name)
它将设置一个REDIS_URL
环境,你可以用:
heroku config | grep REDIS
现在,设置actionCable的配置:
/config/cable.yml
development: &development
:url: redis://localhost:6379
:host: localhost
:port: 6379
:timeout: 1
:inline: true
test: *development
production: &production
:url: redis://redistogo:192csd9c30ca49585ce9d85daf0fer90@tarpon.redistogo.com:49382
:host: tarpon.redistogo.com
:port: 49382
:password: 349f93483fv9erfv849dfvdfbds9
:inline: true
:timeout: 1
主机在@
和:
之间端口在:
之后密码:
heroku run rails c
uri = URI.parse(<your redis URL>)
uri.password
就这些了。
我用这两篇文章作为参考:
http://www.thegreatcodeadventure.com/deploying-action-cable-to-heroku/https://blog.heroku.com/real_time_rails_implementing_websockets_in_rails_5_with_action_cable