为什么stylesheet_link_tag没有链接到生产中的/ assets?

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

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

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

我应该在哪里看?

当助手生成此代码时:

 /stylesheets/application.css 

这是因为管道未以您所处的任何模式启用。有几种可能的原因。

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

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

  • 你不小心在某个地方评论过铁路

有关详细信息,请参阅此问

如果这是升级后的应用程序,请检查管道指南最后一部分中的所有配置选项,以确保正确设置它们。

我知道这是针对rails 3.1但是轨道4的用户可能会发生非常类似的错误,所以为了完整性和帮助未来的googlers。 最可能的原因是您没有将该资产添加到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 ) 

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

我建议您在production.rd中将config.assets.compile = false(默认情况下)启用为true,并查看资产是否在developpemnt中提供。 如果它们被正确提供,那么你应该检查你的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标志中。

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