Rails 3资产目录可以同时从CNAME根目录和app子目录访问吗?

时间:2012-03-13 19:50:14

标签: ruby-on-rails ruby-on-rails-3 passenger

我有一个rails 3.0.10应用程序,我在应用程序目录中可用,如下所示:

https://apps.example.com/myRails3App 

服务器是使用乘客的RHEL 5。开箱即用的应用程序运行良好,我不必将我的路由包装在范围内。

然后我从新域设置CNAME别名以指向应用程序,如下所示:

http://great.vanityurl.com

现在,在重新部署应用程序并重新启动服务器之后,当我从apps.example.com/myRails3App访问应用程序时,从“stylesheet_link_tag”(或“javascript_include_tag”)调用的所有资产都在“apps”中查找资产.example.com / stylesheets“而不是正确的”apps.example.com/myRails3App/stylesheets“(尽管标准链接标记正常工作)。

同时,该应用程序从虚荣心看起来很棒,因为对great.vanityurl.com/stylesheets的引用可以正确解析。

似乎我应该使用像Rails这样的“relative_url_root”,但这当然不能在rails 3.0.10中找到(据我所知)。

我应该怎么做以确保应用程序的外观和功能完全相同,无论是通过原始位置(apps.example.com/myRails3App)还是虚荣网址(great.vanityurl.com)访问它?

2 个答案:

答案 0 :(得分:2)

您可以使用以下组合解决您的紧急问题:

config.action_controller.asset_host = 'apps.example.com'
config.assets.prefix = "/myRails3App"

直接控制您提到的Rails资产助手生成的URL。

答案 1 :(得分:0)

Winfield的答案适用于Rails 3.1,但3.0不喜欢'config.assets.prefix ='。

值得庆幸的是,虽然它不是最终的解决方案,但他用'config.action_controller.asset_host =“指出了正确的方向。在检查了资产主机的主要方法之后,我发现了资产错误=。

我最终把它放在我的application.rb中:

config.action_controller.asset_path = proc { |asset_path|
      if (Rails.env != "development_local") and (!asset_path.starts_with?("/myRails3App"))
        "/myRails3App#{asset_path}"
      else
        asset_path
      end
    }

在部署期间,我让我的capistrano脚本生成一个从{app_root} / public到{app_root} / public / myRails3App的符号链接,允许对myRails3App / stylesheets的所有资产调用,无论用户是否正在访问来自需要应用程序目录的URL。

此解决方案感觉很脏,但它有效。

感谢Winfield,帮助我让我的应用程序正常运行。