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

时间:2012-01-11 18:36:17

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

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

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

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

我应该在哪里看?

4 个答案:

答案 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,但我可能会弄错。