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
4

14 回答 14

313

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

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

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

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

于 2011-09-02T01:18:49.380 回答
202

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

bundle exec rake assets:precompile

如果您使用 Capistrano,2.8.0 版有一个配方可以在部署时处理这个问题。有关详细信息,请参阅资产管道指南的“生产中”部分:http: //guides.rubyonrails.org/asset_pipeline.html

于 2011-09-10T01:43:57.823 回答
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 \;
于 2012-04-18T20:32:34.617 回答
30

capistrano 用户的快速解决方法是将此行放入 Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
于 2011-11-21T17:15:04.247 回答
11

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

解决方案是如上所述使用

bundle exec rake assets:precompile

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

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

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

于 2012-12-29T19:08:39.983 回答
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
于 2011-12-16T13:40:28.717 回答
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)
于 2013-01-11T00:57:17.823 回答
4

这是快速修复:

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

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

帽部署

于 2011-11-17T18:18:13.067 回答
3

我今天遇到了此错误消息,并想将解决方案发布到我的特定案例中。事实证明,我的问题是我的一个 css 文件缺少右括号,这导致文件无法编译。如果您有一个为生产环境设置所有内容(包括资产预编译)的自动化流程,则可能更难注意到这一点。

于 2011-12-07T18:28:55.820 回答
1

毕竟其他都失败了...

我的解决方案是更改布局文件

= stylesheet_link_tag "reset-min", 'application'

= stylesheet_link_tag 'application'

它奏效了!(您可以将重置文件放在清单中。)

于 2012-09-17T00:16:38.873 回答
1

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

于 2014-07-20T16:35:42.520 回答
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
于 2012-04-23T10:36:11.790 回答
0

如果你认为你遵循了一切都很好但仍然不走运,只需确保你/capistrano 在最后运行 touch tmp/restart.txt 或等效项。我在倒霉名单上,但现在:)

于 2013-02-07T06:47:50.403 回答
0

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

运行此命令

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

它会给出异常,修复它,你就完成了。

谢谢

于 2015-05-18T11:38:00.327 回答