Где поставить Rack Middleware в Rails4.1
Я посмотрел на некоторые ответы 1] Включить в qoutes, 2] Не использовать требуют и т. Д., Но ни один из них не работает. Возможно, решение изменилось в Rails4
Я пытаюсь следовать этой инструкции здесь https://devcenter.heroku.com/articles/ruby-websockets
Там написано Скопируйте существующее промежуточное ПО ChatBackend в app/middleware/chat_backend.rb в вашем Rails-проекте. Затем вставьте промежуточное ПО в ваш стек, определенный в 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
Как именно мне добавить промежуточное ПО. Цените любые точные примеры кода.
3 ответа
Вам не нужно ничего требовать, потому что app
находится в пути загрузки Rails 4.x.
Просто поместите ваш промежуточный класс в app/middleware
папку и добавить его в стойку через 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
выход.
Обычно промежуточное программное обеспечение Rack вставляется в приложение Rails, объявляя его внутри config/application.rb
, Вам может понадобиться require 'something'
в заголовке этого файла, а затем внутри блока конфигурации приложения, config.middleware.use Rack::MiddlewareName
как показано ниже.
Если промежуточное программное обеспечение происходит от драгоценного камня, ваш 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
Я закончил в том числе явно по имени файла в 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