rails 3.1.0 ActionView :: Template :: Error(未预编译application.css)


281

我用一个带有索引功能的简单页面控制器制作了一个基本的Rails应用程序,当我加载页面时,我得到了:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

宝石文件

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

7
Bundle exec rake asset:precompile似乎可以解决它,但是为什么它不起作用?
克里斯·穆恩奇

10
即使在运行bundle exec rake asset:precompile之后,我在生产中也遇到相同的问题
卢卡斯雷南

Answers:


313

默认情况下,Rails假定您已在生产环境中对文件进行了预编译,如果要在生产中使用实时编译(在运行时编译资产),则必须将config.assets.compile设置为true

# config/environments/production.rb
...
config.assets.compile = true
...

使用预编译资产时,您可以使用此选项回退到Sprockets,但是缺少任何预编译文件。

如果config.assets.compileoption设置为false并且缺少预编译的文件,您将得到一个“ AssetNoPrecompiledError”,指示丢失的文件的名称。


3
您可能想尝试一下本文所说的内容:devcenter.heroku.com/articles/rails31_heroku_cedar (我自己还没有尝试过)
Chris Muench

7
只需清楚一点,config.assets.compile选项位于config / environments / production.rb中(如果您正在生产中)。而且,如果您希望能够在生产环境中进行实时/延迟编译,则还需要在application.rb中启用延迟编译。
2011年

34
激活运行时编译不是解决方案,因为我们会遇到性能下降的问题。解决方案是解决阻止资产预编译发生的核心问题。
David Tuite 2011年

5
我使用RAILS_ENV = production bundle exec rake asset:precompile对资产进行了预编译。为什么我会收到此错误,并且也需要设置此标志?
托尼

2
@Tony,因为您可能要求的不是application.css / js / image文件,而是您没有在上注册application.rb。添加/编辑application.rbconfig.assets.precompile += %w( first.css second.js )。现在这些文件也将编译。如果仅在链轮中使用它们,则不要添加所有文件require,而仅在<link>/<script>
elado 2013年

202

如果在production.rb中将config.assets.compile设置为false并预编译资产,则将在生产中获得更好的性能。您可以使用以下rake任务进行预编译:

bundle exec rake assets:precompile

如果您使用的是Capistrano,则2.8.0版具有在部署时处理此问题的方法。有关更多信息,请参见《资产管道指南》的“生产中”部分:http : //guides.rubyonrails.org/asset_pipeline.html


14
我不敢相信找到解决方法有多难。
derekerdmann

3
这似乎是一个明显更好的选择:将live compile设置为true“使用更多的内存,比默认的执行效果更差,不建议这样做。” guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell 2012年

rake -T或者bundle exec rake -T是你的朋友。
瑞安

2
@Underworld Bundler是用于管理ruby应用程序中的gem依赖项的工具,它内置在Rails 3中。如果使用捆绑程序,则运行bundle exec rake ...将确保您为应用程序加载正确的rake和关联的依赖项。如果您未使用捆绑程序,则只需运行即可rake ...
richardsun 2012年

3
如果要运行上述命令,请确保已将环境设置为生产模式,或在命令前加上RAILS_ENV = production
JESii 2013年

31

好的-我有同样的问题。我不想使用“ config.assets.compile = true”-我必须将所有.css文件添加到config / environments / production.rb中的列表中:

config.assets.precompile += %w( carts.css )

然后我必须创建(然后删除)tmp / restart.txt

我一直使用stylesheet_link_tag帮助器,因此找到了需要添加的所有其他CSS文件:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;

如果您对不同的分辨率使用媒体查询和不同的CSS文件,这是最好的方法。
Fa11enAngel 2012年

1
我必须在阵列中包含所有CSS文件吗?如果我有40个CSS文件怎么办?
yozzz 2014年

30

capistrano用户的快速解决方案是将这一行添加到Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

11

对于所有正在阅读本文但对application.css自己的自定义CSS类没有问题的人,例如admin.cssbase.css等等。

解决方案是如前所述使用

bundle exec rake assets:precompile

在样式表中引用只是参考 application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

由于资源管道将在application.css中预编译所有样式表。这在开发中也会发生,因此在使用资产管道时使用任何其他引用都是错误的。


8

我在开发环境中遇到了完全相同的错误。最后,我要做的就是修复它:

config.assets.manifest = Rails.root.join("public/assets")

到我的config / environments / development.rb文件,并将其修复。我在开发中与资产相关的最终配置如下所示:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true

这是唯一对我有用的解决方案。也许是我的Rails(3.1.3)版本有问题吗?无论如何,我可以知道我的资产已成功地预编译为public / assets,并且它们的文件名具有与manifest.yml中列出的相同的SHA。由于某些原因,Rails不再在正确的位置寻找资产,即使我的设置以前一直运行良好。此更改解决了该问题。
antinome

感谢您的解决方案。我正在尝试在开发模式下测试某些东西,尽管我已经预编译了资产并且目录中存在public / assets / application.css,但是却说“ application.css没有预编译”,我感到很惊讶。惊讶,他们会自动不设置config.assets.manifest你在发展,就像他们在生产做..
泰勒里克

5

我也遇到了这个问题,尝试在生产环境中运行而不进行预编译仍然会引发未预编译的错误。我必须更改对application.rb进行评论的行:

  # If you precompile assets before deploying to production, use this line
  # Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  Bundler.require(:default, :assets, Rails.env)

2
只是想为以后遇到的任何人澄清一下,您需要在上面更改的代码位于config/application.rb
GMA

4

快速修复方法如下:

如果您使用的是capistrano,请将其添加到deploy.rb中:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

上限部署


2

我今天遇到了此错误消息,并希望针对我的情况发布解决方案。事实证明,我的问题是我的一个css文件缺少右括号,这导致该文件无法编译。如果您有一个自动化过程来为生产环境设置所有内容(包括资产预编译),那么可能很难注意到这一点。


1

毕竟失败了...

我的解决方案是将布局文件从

= stylesheet_link_tag "reset-min", 'application'

= stylesheet_link_tag 'application'

而且有效!(您可以将重置文件放入清单中。)


1

在Heroku上解决此问题的另一种方法:确保已提交并推送了Rakefile。


0

在heroku服务器(只读文件系统)上,如果要运行CSS的运行时编译(不建议这样做,但是可以这样做),请确保已完成以下设置-

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true

0

如果您认为一切都很好,但仍然不走运,只需确保您/ capistrano最后运行touch tmp / restart.txt或等效命令即可。我当时很不幸,但现在:)


0

您可能syntax error正在使用的CSS中有一个。

运行此命令

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

它将给出异常,修复该异常,您已完成。

谢谢

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.