4

我查看了一些答案 1] 包含在 qoutes 中,2] 不要使用 require 等,但它们都不起作用。Rails4 中的解决方案可能发生了变化

我正在尝试按照此处的教程https://devcenter.heroku.com/articles/ruby-websockets#using-with-rails

它说将现有的 ChatBackend 中间件复制到您的 Rails 项目中的 app/middleware/chat_backend.rb。然后将中间件插入到您的堆栈中,在 config/application.rb 中定义:

require 'chat_backend'
config.middleware.use ChatDemo::ChatBackend

我在 app/middlewares/chat_backend.rb 中定义了中间件,如下所示:

require 'faye/websocket'
require 'thread'
require 'redis'
require 'json'
require 'erb'

    module ChatDemo
      class ChatBackend
        KEEPALIVE_TIME = 15 # in seconds
        CHANNEL        = 'twitter-stream'
        def initialize(app)
        end
      /// DELETED CODE for simplicity
    end

这是应用程序.rb

require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'chat_backend'  <= ERROR: config/application.rb:4:in `require': cannot load such file -- chat_backend (LoadError)

Bundler.require(*Rails.groups)

module MyProject
  class Application < Rails::Application

    config.middleware.use ChatDemo::ChatBackend
  end
end

我究竟如何添加中间件。欣赏任何确切的代码示例。

4

3 回答 3

4

您不需要任何东西,因为app它位于 Rails 4.x 加载路径中。

简单地将您的中间件类放入app/middleware文件夹并将其添加到 Rack 通过config.middleware.use(new_middleware, args)

例如: app/middleware/name_is_important.rb

class NameIsImportant
  # logic goes here
end

application.rb(字符串):

config.middleware.use 'NameIsImportant'

或者在环境文件中,例如,development.rb(在这里你可以使用类名):

config.middleware.use NameIsImportant

您的具体案例不起作用,因为您尝试导入(这不是必需的)不存在的类。如果你想出于某种原因将你的类封装在模块中,它必须反映在路径中。

将您的课程添加到正确的目录:app/middleware/chat_demo/chat_backend.rb

module ChatDemo
  class ChatBackend

  end
end

application.rb

config.middleware.use 'ChatDemo::ChatBackend'

然而,我相信这个模块是不必要的,它是你向 Rack 添加中间件的所有问题的根源。尝试在模块中使用类,没有它以及使用不同的目录。观察rack middleware输出。

于 2015-08-12T12:26:22.900 回答
1

通常,Rack 中间件通过在内部声明来插入到 Rails 应用程序中config/application.rb。您可能需要require 'something'在该文件的标题中,然后在应用程序配置块中,config.middleware.use Rack::MiddlewareName 如下图所示。

如果中间件来自 gem,您的 Gemfile 可能require会自动生成,因此该require行可能是多余的。

require 'bouncy_module'

module Coachpage
  class Application < Rails::Application
    config.i18n.enforce_available_locales = true
    # other config options

    config.middleware.use Rack::Bouncy
  end
end
于 2015-08-02T13:11:32.727 回答
-1

我最终在 application.rb 中明确包含文件名

require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(*Rails.groups)

module MyProject
  class Application < Rails::Application

    require File.join(Rails.root, 'app/middlewares/chat_backend.rb')
    config.middleware.use ChatDemo::ChatBackend
  end
end
于 2015-08-02T20:46:04.373 回答