Ruby on rails 4 子目录中的rails 4应用程序-预编译的资源指向根目录而不是子目录

Ruby on rails 4 子目录中的rails 4应用程序-预编译的资源指向根目录而不是子目录,ruby-on-rails-4,deployment,subdirectory,Ruby On Rails 4,Deployment,Subdirectory,Rails 4.1.1使用Apache/Passenger进行生产安装,配置为在子目录“/myapp”中而不是在站点的根目录中运行Rails应用程序 应用程序中的所有链接都可以正常工作,但在SCSS文件中对资产的生产引用除外 background-image: image-url('logo.png'); 编译为: background-image: url("/assets/logo-<hash>.png"); 但这没有效果 我还尝试在config/enviro

Rails 4.1.1使用Apache/Passenger进行生产安装,配置为在子目录“/myapp”中而不是在站点的根目录中运行Rails应用程序

应用程序中的所有链接都可以正常工作,但在SCSS文件中对资产的生产引用除外

    background-image: image-url('logo.png');
编译为:

    background-image: url("/assets/logo-<hash>.png");
但这没有效果

我还尝试在
config/environments/production.env
文件中设置
config.relative\u url\u root
,但没有成功

Rails说要设置
config.action\u controller.relative\u url\u root
,但这会导致缺少方法错误

我最终放弃并使用以下方法将图像嵌入CSS文件:

    background-image: asset-data-url('logo.png');
这是可行的,但只有完全避免子目录问题

我知道Rails会让你为不遵守约定而付费,但在子目录中拥有一个应用程序并不奇怪


关于这个问题,我看了各种各样的帖子,但很难得到一个直接的答案。对于早期版本的Rails,它似乎已经被修复了几次,但不清楚这些修复是否已经进入标准Rails发行版。

在我们的例子中,我们能够进行两次更改,这似乎对Rails 4.1.6起到了作用:

1) 在application.rb中,假设有一个名为“MyAppName
config.relative_url_root = "/myapp"
2) 在config.ru中:

map MyAppName::Application.config.relative_url_root || "/" do
  run Rails.application
end

如果没有config.ru更新,事情就无法正常工作。

在将jquery ui rails gem添加到子目录中部署的另一个应用程序后,我对jquery ui的内置CSS引用的资产也有同样的问题。我拒绝修改第三方CSS文件只是为了解决这个问题,特别是因为Rails似乎能够立即正确地处理所有路径(资产路径除外)

一段时间后,我不知道是什么促使我重新运行rake资产:完全按照给定的预编译任务。令我大吃一惊的是,无论是我自己的图片URL还是jQueryUI,一切都运行得非常完美

有什么不同?如下图所示,如果我从应用程序的bin文件夹调用rake脚本,则所有资产URL都构建不正确,没有子目录

RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp bin/rake assets:precompile
RAILS_RELATIVE_URL_ROOT=/myapp RAILS_ENV=production bundle exec rake assets:precompile
相反,如果我通过bundle exec运行rake,如下所示,所有资产路径都正确生成,包括子目录

RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp bin/rake assets:precompile
RAILS_RELATIVE_URL_ROOT=/myapp RAILS_ENV=production bundle exec rake assets:precompile

至于为什么会发生这种情况,我只能得出结论,运行bin/rake无法加载正确的gem。

我道歉;直到现在我才能够测试这个。在修改config/application.rb和config.ru,并运行
rake assets:precompile
,然后重新启动服务器之后,我在每个请求中都找不到404(并且没有任何内容写入生产日志。有很多活动部件(SSL、Apache/mod_),所以可能它与Rails本身无关。但是,还原更改会使应用程序再次工作。哇…不知道为什么文档中没有这一点…以防其他人感到奇怪,您可以使用
Rails\u relative\u url\u root
env var删除config.relative\u url\u root,但您仍然需要执行cmonkeys步骤 2)