何处将Rack Middleware放入Rails4.1

时间:2015-08-02 03:46:46

标签: ruby-on-rails heroku rack ruby-on-rails-4.1 rack-middleware

我看了一些答案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

这是application.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

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

3 个答案:

答案 0 :(得分:3)

您不需要任何内容​​,因为app位于Rails 4.x加载路径中。

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

例如: 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输出。

答案 1 :(得分:0)

通常,通过在config/application.rb内声明,将Rack中间件插入到Rails应用程序中。您可能需要在该文件的标头中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

答案 2 :(得分:-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