Куда вы кладете файлы промежуточного программного обеспечения 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.
Вы можете создать инициализатор, который требует необходимые файлы, а затем оставить файлы, где вы хотите.
В соответствии с этим инициализаторы выполняются до загрузки промежуточного программного обеспечения стойки.