【问题标题】:Why does stylesheet_link_tag not link to /assets in production?为什么 stylesheet_link_tag 不链接到生产中的 /assets?
【发布时间】:2012-02-08 03:09:11
【问题描述】:

我刚刚为新的 Rails 3.1 应用程序进行了第一次部署,但资产似乎无法正常工作。我在部署时预编译了所有内容,它出现在public/assets 中,就像预期的那样。但是,在我的布局中,例如stylesheet_link_tag "application" 的输出有一个指向/stylesheets/application.css 的href。这显然行不通。

奇怪的是,在开发模式下一切似乎都很好,它像预期的那样链接到/assets/application.css

我已将我的 config/application.rbconfig/environments/production.rb 文件与资产管道上的另一个应用程序进行了比较,相关设置似乎相同。

我应该去哪里看?

【问题讨论】:

  • 您确定生产合并中的application.css 具有您在开发中使用的所有css。打开文件并检查 application.css 中是否缺少样式
  • 是的,存在并包含我所期望的一切,只是空格更少。

标签: ruby-on-rails asset-pipeline sprockets


【解决方案1】:

警告:在生产环境中设置config.assets.compile = true 会使您的应用容易受到Rails Asset Pipeline Directory Traversal Vulnerability (CVE-2018-3760) 的攻击。

我建议您在 production.rd 中启用 config.assets.compile = false(默认情况下)为 true 并查看资产在 developmentemnt 中的服务。如果它们被正确提供,那么您应该检查您的 application.css 以查看您是否在目录中正确包含其他样式表,例如拥有 css 文件

/*
*= require scaffold
*= require pagination
*= require_self
*= require_tree.
*/

其中脚手架和分页是 css 文件。或在 config.assets.precompile 标志下提及它们,如下所示。

config.assets.precompile += %w(pagination.css scaffold.css)

我认为预编译的原因是有效的(application.js、application.css 和所有非 JS/CSS 都已添加)并且任何附加资产都应添加到 config.assets.precompile 标志。

【讨论】:

  • 我打开了编译,但这并没有什么不同。我也打开了config.assets.debug = true,但这也没有改变任何东西。 public/assets/manifest.yml 文件存在,并且包含一个条目application.css: application-642da156f9df61facf341073150aa860.css,并且该文件存在。
  • 您说过在开发模式下一切正常,并且 config.assets.compile = true 应该是一样的。你能在 app/assets 目录中发布你的层次结构的要点吗
【解决方案2】:

我认为资产应该在 app/assets 而不是 public/assets 但我可能弄错了。

【讨论】:

  • 在生产中,资产将从 publci/assets 目录提供,因此我们需要预编译资产以从 app/assets(etc) 移动到 publc/assets
【解决方案3】:

当助手生成这段代码时:

/stylesheets/application.css

这是因为在您所处的任何模式下都没有启用管道。有几个可能的原因。

  • 您在错误的配置文件中启用了管道。 (管道应该在 application.rb 配置文件中启用)

  • 您已在 application.rb 中启用它并在其他地方禁用它。

  • 你不小心在某处注释掉了一个railtie

详情请见this question

如果这是升级后的应用,请检查管道指南的 last section 中的所有配置选项,以确保您已正确设置它们。

【讨论】:

  • 感谢您为我指明正确的方向。我不需要所有 Rails(仅限 mongodb 的应用程序),并且缺少 require "sprockets/railtie"。仍然不确定为什么这在开发中并不重要。
  • 请告诉我更多关于你是如何解决这个问题的?从 3.x 升级后我遇到了同样的问题。
  • 在我使用 Rails 4.0 的情况下,问题是我给助手提供了错误的路径。给它正确的使用 /assets 而不是 /stylesheets
【解决方案4】:

我知道这适用于 rails 3.1,但 Rails 4 的用户可能会发生非常类似的错误,因此为了完整性和帮助未来的谷歌用户。 最可能的原因是您没有将该资产添加到 production.rb 中的预编译指令中,它看起来像这样:

# Precompile additional assets.
# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
config.assets.precompile += %w(  )

正如 OP 所说,application.css 没有被添加,症状是 url 以 /stylesheets 或 /javascripts 而不是资产开头。所以解决办法是

config.assets.precompile += %w( your_assets.css your_assets.js )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2019-08-12
    • 2019-04-29
    • 2012-10-01
    • 2019-05-01
    相关资源
    最近更新 更多