【问题标题】:rails 4 app in subdirectory - precompiled assets point to root instead of subdirectory子目录中的 rails 4 app - 预编译资产指向根目录而不是子目录
【发布时间】:2014-07-08 15:38:07
【问题描述】:

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

应用程序中的所有链接都可以正常工作,但在生产环境中对 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/environments/production.env 文件中设置config.relative_url_root,但没有成功。

Rails guides 说要设置 config.action_controller.relative_url_root,但这会导致缺少方法错误。

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

    background-image: asset-data-url('logo.png');

这可行,但只能完全避免子目录问题。

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

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

【问题讨论】:

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


    【解决方案1】:

    在我们的例子中,我们能够进行两项更改,这在 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 更新,事情将无法正常工作。

    【讨论】:

    • 我很抱歉;直到现在我都无法对此进行测试。在修改 config/application.rb 和 config.ru,运行rake assets:precompile,然后重新启动服务器后,我在每个请求上都得到 404 Not Found(并且没有任何内容被写入生产日志。那里有很多移动部件(SSL、Apache/mod_passenger),所以也许它与 Rails 本身无关。但是,恢复更改会使应用程序再次工作。
    • 哇...不知道为什么这不在guides.rubyonrails.org/… 的文档中...以防万一其他人想知道,您可以使用RAILS_RELATIVE_URL_ROOT 删除config.relative_url_root env var -- 但你仍然需要执行 cmonkeys 步骤 2)
    【解决方案2】:

    将 jquery-ui-rails gem 添加到部署在子目录中的另一个应用程序后,我遇到了与 jQuery UI 的内置 CSS 引用的资产相同的问题。我拒绝修改 3rd-party CSS 文件只是为了解决这个问题,特别是因为 Rails 似乎可以开箱即用地正确处理所有路径(资产路径除外)。

    一段时间后,我不知道是什么促使我重新运行 rake assets:precompile 任务,完全按照给定的here。令我完全惊讶的是,我自己的图像 URL 和 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 不会加载正确的 gem。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-30
      • 2012-01-08
      • 2013-09-12
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      相关资源
      最近更新 更多