Где поставить 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
Другие вопросы по тегам