Я занимаюсь рефакторингом некоторой логики, встроенной в приложение Rails, в промежуточное программное обеспечение, и одно раздражение, с которым я столкнулся, - это кажущееся отсутствие соглашения о том, где их разместить.
В настоящее время я остановился на приложении / промежуточном ПО
, но я мог бы с таким же успехом перенести его на поставщика / промежуточное ПО
или, возможно, поставщика / плагины / промежуточное ПО
. ..
Самая большая проблема заключается в необходимости требовать отдельные файлы в верхней части 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
.
Я не знаю о конвенции, но почему бы не поместить его в каталог /lib
? Файлы в нем автоматически загружаются Rails.
Вы можете создать инициализатор, который требует необходимых файлов, а затем оставить файлы там, где вы хотите.
Согласно это инициализаторы выполняются до загрузки промежуточного программного обеспечения стойки.
Рабочее решение, которое у меня есть до сих пор, - это перемещение требуемого промежуточного ПО в config / middleware.rb
и требование этого файла в environment.rb
, что сводит его к единственному требованию, которое я можно смириться.
Я все еще хотел бы услышать, как другие люди решили эту, казалось бы, простую проблему добавления промежуточного программного обеспечения в Rails.
Вы можете поместить его в 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:
#config/application.rb
require 'lib/rack/my_adapter.rb'
module MyApp
class Application < Rails::Application
config.middleware.use Rack::MyAdapter
end
end