3

我正在部署一个打包到“abc.war”中的 JRuby/Rails 应用程序,并在同一个 Tomcat 实例中部署了一个打包到“def.war”中的 Java 应用程序。

我的 Rails 应用程序中有一个名为“Blogs”的资源,在 routes.rb 中有以下条目

resources  :blogs

有了 routes.rb 中的这个条目,我有了 blogs_path() 之类的助手,所以我可以使用如下语句:

<%= link_to "Blogs", blogs_path %>

在我的应用程序视图文件中,点击生成的链接会显示博客列表。

当此应用程序与 Webrick Web 服务器(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 会自动计算在构建“blogs_path”生成的实际 URL 时,将基本 URL 和 blogs_path() 代码考虑在内。

在“abc.war”文件中将应用程序部署到 JRuby/Tomcat 时,基本 URL 从http://localhost:3000更改为“http://localhost:8081/abc”。因此键入“http:// localhost:8081/abc/blogs" 会给我一个博客列表,"http://localhost:8081/blogs" 给我一个 404 错误。但是,问题是虽然应用程序的基本 URL包括 WAR 文件名的后缀(即“abc”)Rails 没有注意到这一点,因此在调用 blogs_path() 时仍会生成“http://localhost:8081/blogs”作为 URL。当我点击链接,它给了我标准的Tomcat 404页面。

是否有任何简单的方法可以让 Rails 获取以引用“abc”为后缀的基本 URL、WAR 文件的名称,并在 JRuby/Tomcat 部署中适当地生成 URL?而且因为这个应用程序是和 def.war 一起运行的,所以我不能让它成为根应用程序。

4

2 回答 2

4

在 stackoverflow.com 上发现了一个类似的问题。在文件/config.ru中,我执行了以下操作:

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

在部署新的 WAR 之前,我还必须确保清除 Tomcat 创建的文件夹以扩展我的 WAR 文件。

然后我的应用程序就在 /abc URL 范围内工作,无论是独立的还是在 Tomcat 的 WAR 文件中,它的工作原理都是一样的。

编辑

还有一件事,您还将其添加到您的 config/environments/production.rb 和 config/environments/development.rb (如果在生产模式下):

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

否则,当您在视图中调用您的助手(例如 stylesheet_link_tag)时,它们将生成没有“/abc”的链接。

于 2011-11-01T15:35:57.527 回答
0

最好的解决方案是将 webapp 作为 Tomcat 下的 ROOT 应用程序运行,这样就无需在所有 url 中包含“/abc”。

于 2011-11-02T03:13:05.000 回答