JRuby: Warbler: Tomcat: помощники Rails не получают базовый URL с суффиксом расширения WAR - PullRequest
3 голосов
/ 31 октября 2011

Я развертываю приложение JRuby / Rails, упакованное в «abc.war», и оно развертывается с приложением Java, упакованным в «def.war» в том же экземпляре Tomcat.

В моем приложении на Rails есть ресурс под названием «Блоги» со следующей записью в routs.rb

resources  :blogs

С этой записью в routs.rb у меня есть помощники, такие как blogs_path(), чтобы я мог использовать такие утверждения, как:

<%= link_to "Blogs", blogs_path %>

в моем файле представления приложения, и при нажатии на сгенерированную ссылку отображается список блогов.

Когда это приложение работает автономно с веб-сервером Webrick (JRuby 1.6.4, сконфигурированный с Ruby 1.9 и Rails 3.0.10), оно работает нормально, так как http://localhost:3000/blogs возвращает мне списокиз блогов, когда я нажму эту ссылку).Когда я развертываю приложение на URL другого базового сервера, например, «http://funky -freddy-101.heroku.com», мне не нужно менять код с «blogs_path», потому что Rails автоматически вычисляетбазовый URL и код blogs_path () учитывают это при создании фактического URL, созданного с помощью "blogs_path".

При развертывании приложения в JRuby / Tomcat в файле "abc.war" базовый URL изменяется сhttp://localhost:3000" в "http://localhost:8081/abc". Так что набрав" http://localhost:8081/abc/blogs" в браузере, я получу список блогов, а "http://localhost:8081/blogs" выдаст мне ошибку 404. Однако проблема в том, что хотя базовый URL дляприложение включает в себя суффикс имени файла WAR (т. е. «abc»), Rails не обнаружил его и, следовательно, по-прежнему генерирует «http://localhost:8081/blogs" в качестве URL-адреса при вызове blogs_path ().Когда я нажимаю на ссылку, она дает мне стандартную страницу Tomcat 404.

Есть ли какой-нибудь простой способ заставить Rails получить базовый URL с суффиксом «abc», именем файла WAR и соответствующим образом генерировать URL в развертывании JRuby / Tomcat?И поскольку это приложение работает вместе с def.war, я не могу сделать его корневым приложением.

Ответы [ 2 ]

4 голосов
/ 01 ноября 2011

Я нашел похожий вопрос на stackoverflow.com . В файле / config.ru я сделал следующее:

map '/abc' do
   run Abc::Application
end 

Мне также нужно было убедиться, что я сдул папку, созданную Tomcat, чтобы развернуть файл WAR, прежде чем развернуть новую WAR.

Тогда мое приложение просто работало в области URL / abc, и оно работало одинаково, как в автономном режиме, так и в файле WAR с Tomcat.

EDIT

Еще одна вещь, которую вы также добавите в свои config / environment / production.rb и config / environment / development.rb (если используется в производственном режиме):

config.action_controller.asset_path = proc { |path| "/abc#{path}" }

в противном случае, когда вы вызываете своих помощников, таких как stylesheet_link_tag, в ваших представлениях, они будут генерировать ссылки без "/abc".

0 голосов
/ 02 ноября 2011

Лучшее решение - запустить веб-приложение в качестве приложения ROOT под Tomcat, оно избавит от необходимости включать «/ abc» во все ваши URL-адреса.

...