Rails4.1中机架中间件放在哪里

cod*_*ver 5 rack ruby-on-rails heroku rack-middleware ruby-on-rails-4.1

我查看了一些答案 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
Run Code Online (Sandbox Code Playgroud)

我在 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
Run Code Online (Sandbox Code Playgroud)

这是应用程序.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
Run Code Online (Sandbox Code Playgroud)

具体如何添加中间件。感谢任何确切的代码示例。

Woj*_*ski 5

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

简单地将您的中间件类放入app/middleware文件夹中,然后通过以下方式将其添加到机架中config.middleware.use(new_middleware, args)

例如: app/middleware/name_is_important.rb

class NameIsImportant
  # logic goes here
end
Run Code Online (Sandbox Code Playgroud)

application.rb在(字符串)中:

config.middleware.use 'NameIsImportant'
Run Code Online (Sandbox Code Playgroud)

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

config.middleware.use NameIsImportant
Run Code Online (Sandbox Code Playgroud)

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

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

module ChatDemo
  class ChatBackend

  end
end
Run Code Online (Sandbox Code Playgroud)

application.rb

config.middleware.use 'ChatDemo::ChatBackend'
Run Code Online (Sandbox Code Playgroud)

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


Top*_*unt 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
Run Code Online (Sandbox Code Playgroud)