2010-08-06 3 views
41

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


Update: Теперь, когда мы используем Rails 3.0, я лечу приложение Rails, как и любое другое приложение Rack; файлы кода для промежуточного программного обеспечения перейдите в lib (или драгоценный камень, указанный в Gemfile), и требуются и загружаются в config.ru.

ответ

48

Начиная с Rails 3.2, промежуточное ПО Rack принадлежит к каталогу приложений/промежуточного программного обеспечения.

Он работает «из коробки» без каких-либо явных требований.

Быстрый пример:

Я использую класс промежуточного слоя под названием CanonicalHost, который реализуется в приложения/промежуточного/canonical_host.rb. Я добавил следующую строку в production.rb (примечание что класс промежуточного слоя явно задан, а не в кавычках, которая работает в любой среде конкретных конфигурационных файлов):

config.middleware.use CanonicalHost, "example.com" 

Если вы добавив промежуточное ПО к application.rb, вам нужно будет включить котировки, согласно @mltsy's comment.

config.middleware.use "CanonicalHost", "example.com" 
+0

Спасибо, я буду помнить об этом, когда обновляюсь. –

+4

Не могли бы вы добавить любую ссылку для справки? Это не работает из коробки для меня и Google/Rails руководства не помогают ... спасибо! – dgilperez

+0

Я получил эту работу из коробки, после того как понял, что сделал тупую ошибку размещения ее в корневой папке вместо (уже указанной) папки приложения. Итак, foo_app/app/middleware/file.rb. – d3vkit

0

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

+0

Только после запуска среды environment.rb, если вообще. Перемещение их в lib не разрешало неинициализированные постоянные ошибки. –

0

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

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

+0

Нет. Все равно получайте неинициализированную константу. –

+0

Похоже, я немного оптимистично читал это. Думаю, config.ru тоже не соответствует вашим требованиям? – Jean

+0

Ну, для этого потребуется использовать скрипт вместо скрипта/сервера, правильно? Я мог бы это сделать, если бы мне пришлось, но я честно считал, что это будет проще, чем это. –

0

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

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

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 
23

Вы можете поместить его в lib/tableized/file_name.rb. Пока класс, который вы пытаетесь загрузить, можно обнаружить по имени файла, Rails автоматически загрузит необходимый файл. Так, например:

config.middleware.use "MyApp::TotallyAwesomeMiddleware" 

Вы бы держать в:

lib/my_app/totally_awesome_middleware.rb 

Rails ловит const_missing и attemts загружать файлы, соответствующие недостающие константы автоматически. Просто убедитесь, что ваши имена совпадают, и вы подлины.Рельсы даже обеспечивает изящные помощников, которые будут помогать вам определить путь к файлу легко:

>> ChrisHeald::StdLib.to_s.tableize.singularize 
=> "chris_heald/std_lib" 

Так что мой STDLIB живет в lib/chris_heald/std_lib.rb, и автоматически загружаются, когда я ссылаться на него в коде.

+0

У меня есть некоторое промежуточное программное обеспечение под названием «Rack :: Backstage». Поместите его в 'lib/rack/backstage.rb'.Унифицированная постоянная ошибка. –

+1

Это работает _only_, если первым параметром является строка. Однажды я понял это, успех! –

+0

Прохладный решение. :) –

11

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

+0

Я нахожусь на рельсах 3.2.18 и имею ту же проблему, когда я помещаю это в application.rb - но когда я помещал его в конфигурацию конкретной среды, тогда он работал нормально! Если вы следуете пути загрузки, начиная с config.ru, оказывается, что application.rb загружается перед большинством других вещей, тогда инициализируется приложение (которое загружает все динамические инициализаторы, включая middlewares), а остальные файлы среды загружаются после что, к тому времени, определены константы промежуточного ПО! – mltsy

Смежные вопросы

 Смежные вопросы