Куда вы кладете файлы промежуточного программного обеспечения Rack и требует?

Я нахожусь в процессе рефакторинга некоторой логики, встроенной в приложение Rails, в промежуточное ПО, и одна неприятность, с которой я столкнулся, - это кажущееся отсутствие соглашения о том, где их разместить.

В настоящее время я остановился на app/middleware но я мог бы так же легко переместить его в vendor/middleware или, может быть vendor/plugins/middleware...

Самая большая проблема заключается в необходимости отдельных файлов в верхней части config/environment.rb

require "app/middleware/system_message"
require "app/middleware/rack_backstage"

или я получаю неинициализированные постоянные ошибки на config.middleware.use линий. Это может очень быстро запутаться. Я бы предпочел, чтобы это было где-то спрятано в инициализаторе.

Есть ли обычное место для размещения этого материала?


Конкретный ответ, который я ищу с помощью этой награды: где я могу поместить строки с запросами, чтобы они не загромождали файл environment.rb, но все же загружались до вызова config.middleware.use? Все, что я пробовал, приводит к неинициализированным постоянным ошибкам.


Обновление: теперь, когда мы используем Rails 3.0, я рассматриваю приложение Rails как любое другое приложение Rack; файлы кода для промежуточного программного обеспечения идут в lib (или драгоценный камень, указанный в Gemfile) и требуются и загружаются в config.ru,

7 ответов

Решение

Начиная с Rails 3.2, промежуточное программное обеспечение Rack находится в каталоге app/middleware.

Он работает "из коробки" без каких-либо явных требований.

Быстрый пример:

Я использую класс промежуточного программного обеспечения под названием CanonicalHost, который реализован в app/middleware / canonical_host.rb. Я добавил следующую строку в production.rb (обратите внимание, что класс промежуточного программного обеспечения задан явно, а не в виде строки в кавычках, которая работает для любых конфигурационных файлов, зависящих от среды):

config.middleware.use CanonicalHost, "example.com"

Если вы добавляете промежуточное программное обеспечение в application.rb, вам нужно будет включить кавычки в соответствии с комментарием @mltsy.

config.middleware.use "CanonicalHost", "example.com"

Вы можете положить его в lib/tableized/file_name.rb, Пока класс, который вы пытаетесь загрузить, можно обнаружить по его имени, Rails автоматически загрузит необходимый файл. Так, например:

config.middleware.use "MyApp::TotallyAwesomeMiddleware"

Вы должны держать в:

lib/my_app/totally_awesome_middleware.rb

Rails перехватывает const_missing и пытается автоматически загрузить файлы, соответствующие отсутствующим константам. Просто убедитесь, что ваши имена совпадают, и вы подливка. Rails даже предоставляет отличные помощники, которые помогут вам легко определить путь к файлу:

>> ChrisHeald::StdLib.to_s.tableize.singularize
=> "chris_heald/std_lib"

Так что мой stdlib живет в lib/chris_heald/std_lib.rbи загружается, когда я ссылаюсь на него в коде.

В моем приложении Rails 3.2 я смог получить свое промежуточное ПО TrafficCop загрузка, помещая это в app/middleware/traffic_cop.rbтак же, как описал @MikeJarema. Затем я добавил эту строку в мой config/application.rb, как указано:

config.middleware.use TrafficCop

Однако при запуске приложения я продолжал получать эту ошибку:

uninitialized constant MyApp::Application::TrafficCop

Явное указание корневого пространства имен также не помогло:

config.middleware.use ::TrafficCop
# uninitialized constant TrafficCop

По какой-то причине (которую мне еще предстоит выяснить), на данном этапе жизненного цикла Rails, app/middleware не был включен в пути загрузки. Если бы я удалил config.middleware.use и запустить консоль, я мог получить доступ к TrafficCop постоянный без каких-либо проблем. Но он не мог найти его в app/middleware во время настройки.

Я исправил это, заключив имя класса промежуточного программного обеспечения в кавычки, например так:

config.middleware.use "TrafficCop"

Таким образом, я бы избежал uninitialized constant ошибка, так как Rails не пытается найти TrafficCop класс только что. Но когда он начнет строить стек промежуточного программного обеспечения, он подтвердит строку. К этому времени, app/middleware находится в путях загрузки, и поэтому класс будет загружаться правильно.

Для Rails 3:

#config/application.rb
require 'lib/rack/my_adapter.rb'
module MyApp
  class Application < Rails::Application
    config.middleware.use Rack::MyAdapter
  end
end

Рабочее решение, которое я имею, перемещает промежуточное программное обеспечение, необходимое для config/middleware.rb и требует этот файл в environment.rb, сводя его к одному требованию, с которым я могу жить.

Я все еще хотел бы услышать, как другие люди решили эту, казалось бы, основную проблему добавления промежуточного программного обеспечения в Rails.

Я не знаю о соглашении, но почему бы не положить его в /lib каталог? Файлы там автоматически загружаются Rails.

Вы можете создать инициализатор, который требует необходимые файлы, а затем оставить файлы, где вы хотите.

В соответствии с этим инициализаторы выполняются до загрузки промежуточного программного обеспечения стойки.

Другие вопросы по тегам