Подтвердить что ты не робот

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

Я занимаюсь реорганизацией некоторой логики, встроенной в приложение 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.

4b9b3361

Ответ 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.