rails 4 app in子目录 - 预编译资产指向root而不是子目录

时间:2014-07-08 15:38:07

标签: ruby-on-rails-4 deployment subdirectory

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发行版。

2 个答案:

答案 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不会加载正确的宝石。