Rails 5 ActionCable on Heroku未初始化常量NameError



我知道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

相关内容

  • 没有找到相关文章

最新更新