为什么stylesheet_link_tag没有链接到生产中的/ assets?
我刚刚为新的Rails 3.1应用程序进行了第一次部署,但资产似乎无法正常工作。 我在部署时预编译了所有内容,并且它在预期的public/assets
。 但是,我的布局中的stylesheet_link_tag "application"
的输出有一个指向/stylesheets/application.css
的href。 这显然不起作用。
奇怪的是,在开发模式下,一切似乎都很好,它像预期的那样链接到/assets/application.css
。
我将config/application.rb
和config/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
但我可能会弄错。