【问题标题】:Rails 5 ActionCable on Heroku uninitialized constant NameErrorHeroku上的Rails 5 ActionCable未初始化常量NameError
【发布时间】:2017-02-21 12:45:50
【问题描述】:

我知道 Heroku 只允许 2 个端口,即 80 和 443 进行连接,这就是为什么您需要为 WebSockets 运行单独的服务器的原因。我遇到了this guide,它声称允许您在同一台服务器上运行两个进程。我还根据用户的评论将以下行:
if Faye::WebSocket.websocket?(env) 更改为:
::WebSocket::Driver.websocket?(env),因为我没有使用 Faye。
但是,我收到错误未初始化的常量 ChatActionCable (NameError)。我尝试了this page 上的指南,但没有任何收获。

我的 application.rb 文件如下所示:

require_relative 'boot'

require 'rails/all'

module Third
  class Application < Rails::Application
    config.autoload_paths += %W(#{config.root}/lib)
  end
end

TIA。

更新:指南的问题在于中间件文件的名称。我将其更改为chat_action_cable.rb,至少中间件开始运行。现在问题在于 ::WebSocket::Driver.websocket?(env) 行作为未初始化常量 NameError。

【问题讨论】:

    标签: ruby-on-rails heroku websocket


    【解决方案1】:

    我认为网上的例子不完整。

    你的中间件应该继承自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/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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2016-07-15
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多