Где вы размещаете файлы промежуточного программного обеспечения стойки и требуете?
Я занимаюсь реорганизацией некоторой логики, встроенной в приложение 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
.
Ответы
Ответ 1
Как и в случае с Rails 3.2, промежуточное ПО Rack принадлежит каталогу приложения/промежуточного программного обеспечения.
Он работает "из коробки" без каких-либо явных запросов.
Быстрый пример:
Я использую класс промежуточного программного обеспечения под названием CanonicalHost, который реализован в приложении/промежуточном программном обеспечении /canonical _host.rb. Я добавил следующую строку в production.rb( note, которую явно указывается класс промежуточного ПО, а не как строка с кавычками, которая работает для любых конфигурационных файлов, специфичных для среды):
config.middleware.use CanonicalHost, "example.com"
Если вы добавляете промежуточное программное обеспечение в application.rb, вам нужно включить кавычки в соответствии с комментарием @mltsy.
config.middleware.use "CanonicalHost", "example.com"
Ответ 2
Вы можете поместить его в lib/tableized/file_name.rb
. Пока класс, который вы пытаетесь загрузить, можно обнаружить по имени файла, Rails автоматически загрузит необходимый файл. Итак, например:
config.middleware.use "MyApp::TotallyAwesomeMiddleware"
Вы будете продолжать:
lib/my_app/totally_awesome_middleware.rb
Rails ловит const_missing и attemts, чтобы автоматически загружать файлы, соответствующие отсутствующим константам. Просто убедитесь, что ваши имена совпадают, и вы подлины. Rails даже предоставляет отличные помощники, которые помогут вам легко идентифицировать путь для файла:
>> ChrisHeald::StdLib.to_s.tableize.singularize
=> "chris_heald/std_lib"
Итак, мой stdlib живет в lib/chris_heald/std_lib.rb
и автоматически загружается, когда я ссылаюсь на него в коде.
Ответ 3
В моем приложении 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
находится в пути загрузки, и поэтому класс будет загружаться правильно.
Ответ 4
Для Rails 3:
#config/application.rb
require 'lib/rack/my_adapter.rb'
module MyApp
class Application < Rails::Application
config.middleware.use Rack::MyAdapter
end
end
Ответ 5
Я не знаю соглашения, но почему бы не поместить его в каталог /lib
? Файлы там автоматически загружаются Rails.
Ответ 6
Вы можете создать инициализатор, который требует наличия необходимых файлов, а затем оставить файлы там, где вы хотите.
В соответствии с this инициализаторы выполняются до загрузки промежуточного программного обеспечения стойки.
Ответ 7
Рабочее решение, на котором я до сих пор перемещаю промежуточное ПО, требует config/middleware.rb
и требует, чтобы этот файл находился в environment.rb
, уменьшив его до одного запроса, с которым я могу жить.
Мне бы хотелось услышать, как другие люди решили эту, казалось бы, основную проблему добавления промежуточного ПО в Rails.