Rails 4.1.1生产安装使用Apache / Passenger配置为在子目录中运行rails app" / myapp"而不是网站的根。
应用中的所有链接都可以正常工作,但在生产中对SCSS文件中的资产的引用,例如
background-image: image-url('logo.png');
汇编到:
background-image: url("/assets/logo-<hash>.png");
而不是:
background-image: url("/myapp/assets/logo-<hash>.png");
我在预编译资产时尝试过这样的事情:
RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp rake assets:precompile
但这没有效果。
我还尝试在config.relative_url_root
文件中设置config/environments/production.env
,但没有运气。
Rails guides说要设置config.action_controller.relative_url_root
,但这会导致方法错误。
我最终通过使用:
放弃并将图像嵌入到CSS文件中 background-image: asset-data-url('logo.png');
有效,但只能完全避免子目录问题。
我知道Rails会让你为不遵守约定而付费,但在子目录中拥有一个应用并不完全是异乎寻常的。
我似乎在这个问题上有各种各样的帖子,但很难得到一个直接的答案。对于早期版本的Rails,似乎已经修复了几次,但是不清楚这些修复程序是否已经进入标准的Rails发行版。
答案 0 :(得分:2)
在我们的案例中,我们能够进行两项更改,这些更改在Rails 4.1.6中似乎对我们有用:
1)在application.rb中,假设有一个名为&#34; MyAppName&lt;导轨::应用&#34 ;.在这里,我们有
config.relative_url_root = "/myapp"
2)在config.ru:
map MyAppName::Application.config.relative_url_root || "/" do
run Rails.application
end
如果没有config.ru更新,事情就无法正常工作。
答案 1 :(得分:0)
将jquery-ui-rails gem添加到部署在子目录中的另一个应用程序后,我对jQuery UI的内置CSS引用的资产遇到了同样的问题。我拒绝修改第三方CSS文件只是为了解决这个问题,特别是因为Rails似乎正在开箱即用地处理所有路径(资源路径除外)。
拔掉头发一段时间之后,我不知道是什么促使我重新运行rake资产:预编译任务完全与给定here完全相同。令我完全惊讶的是,一切都很完美,包括我自己的图片网址和jQuery UI。
有什么不同?如果我从应用程序的bin文件夹中调用rake脚本,如下所示,则所有资产URL都是错误构建的,没有子目录。
RAILS_ENV=production RAILS_RELATIVE_URL_ROOT=/myapp bin/rake assets:precompile
如果我通过bundle exec运行rake,如下所示,所有资产路径都正确生成,包括子目录。
RAILS_RELATIVE_URL_ROOT=/myapp RAILS_ENV=production bundle exec rake assets:precompile
至于为什么会发生这种情况,我只能得出结论,运行bin / rake不会加载正确的宝石。