我看了一些答案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
我究竟如何添加中间件。感谢任何确切的代码示例。
答案 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