我刚刚为新的Rails 3.1应用程序进行了第一次部署,但资产似乎无法正常工作。我在部署时预先编译了所有内容,它在预期中以public/assets
形式出现。但是,我布局中的stylesheet_link_tag "application"
输出的href指向/stylesheets/application.css
。这显然不起作用。
奇怪的是,在开发模式下,一切似乎都很好,它会像预期的那样链接到/assets/application.css
。
我已将config/application.rb
和config/environments/production.rb
个文件与我们在资产管道上的其他应用进行了比较,相关设置似乎相同。
我应该在哪里看?
答案 0 :(得分:14)
当助手生成此代码时:
/stylesheets/application.css
这是因为没有以你所处的模式启用管道。有几个可能的原因。
您在错误的配置文件中启用了管道。 (应在application.rb配置文件中启用管道)
您已在application.rb中启用它并在其他位置禁用。
你不小心在某处注释了铁路
有关详细信息,请参阅this question。
如果这是升级后的应用,请检查管道指南的last section中的所有配置选项,以确保所有配置都正确设置。
答案 1 :(得分:7)
我知道这是针对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 )
答案 2 :(得分:1)
警告:在制作中设置config.assets.compile = true
可能会使您的应用易受Rails Asset Pipeline Directory Traversal Vulnerability (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标志中。
答案 3 :(得分:-1)
我认为资产应该在app/assets
而不是public/assets
,但我可能会弄错。