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

Я нахожусь в процессе рефакторинга некоторой логики, встроенной в приложение 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 ]

48 голосов
/ 10 февраля 2012

Начиная с 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"
23 голосов
/ 13 августа 2010

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

11 голосов
/ 25 апреля 2013

В моем приложении на 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 голосов
/ 12 августа 2010

Для рельсов 3:

#config/application.rb
require 'lib/rack/my_adapter.rb'
module MyApp
  class Application < Rails::Application
    config.middleware.use Rack::MyAdapter
  end
end
0 голосов
/ 12 августа 2010

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

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

0 голосов
/ 11 августа 2010

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

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

0 голосов
/ 07 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...