rails 3.1.0 ActionView::Template::Error(application.css 未预编译)
Posted
技术标签:
【中文标题】rails 3.1.0 ActionView::Template::Error(application.css 未预编译)【英文标题】:rails 3.1.0 ActionView::Template::Error (application.css isn't precompiled) 【发布时间】:2011-11-08 16:35:51 【问题描述】:我用一个带有索引功能的简单页面控制器制作了一个基本的 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
【问题讨论】:
bundle exec rake assets:precompile 似乎可以修复它,但为什么它不能正常工作? 我在生产中遇到同样的问题,即使在运行 bundle exec rake assets:precompile 【参考方案1】:默认情况下,Rails 假定您已在生产环境中预编译文件,如果您想在生产环境中使用实时编译(在运行时编译您的资产),您必须将 config.assets.compile 设置为 true.
# config/environments/production.rb
...
config.assets.compile = true
...
当您使用预编译资产但缺少任何预编译文件时,您可以使用此选项回退到 Sprockets。
如果 config.assets.compile
选项设置为 false 并且缺少预编译文件,您将收到一个“AssetNoPrecompiledError”指示丢失文件的名称。
【讨论】:
你可能想试试这篇文章说的:devcenter.heroku.com/articles/rails31_heroku_cedar(我自己还没试过) 明确一点,config.assets.compile 选项位于 config/environments/production.rb 中(如果您在生产环境中工作)。如果您希望能够在生产环境中进行实时/延迟编译,您还需要在 application.rb 中启用延迟编译。 激活运行时编译不是解决方案,因为我们会受到性能影响。解决方案是解决阻止资产预编译发生的核心问题。 我使用 RAILS_ENV=production bundle exec rake assets:precompile 预编译了资产。为什么我会收到此错误并且也需要设置此标志? @Tony,因为您可能要求的不是 application.css/js/image 文件,而您没有在application.rb
上注册它。添加/编辑application.rb
:config.assets.precompile += %w( first.css second.js )
。现在这些文件也将编译。如果您仅在 sprockets require
中使用它们,请不要添加所有文件,但前提是您将它们包含在 <link>
/<script>
【参考方案2】:
如果您在 production.rb 中将 config.assets.compile 设置为 false 并预编译您的资产,您将在生产中获得更好的性能。您可以使用此 rake 任务进行预编译:
bundle exec rake assets:precompile
如果您使用 Capistrano,2.8.0 版有一个配方可以在部署时处理这个问题。有关详细信息,请参阅资产管道指南的“生产中”部分: http://guides.rubyonrails.org/asset_pipeline.html
【讨论】:
我无法相信找到如何做到这一点是多么困难。 这显然是更好的选择:将实时编译设置为 true“使用更多内存,性能比默认值更差,不推荐。” guides.rubyonrails.org/asset_pipeline.html#live-compilationrake -T
或 bundle exec rake -T
是你的朋友。
@Underworld Bundler 是一个用于管理 ruby 应用程序中 gem 依赖项的工具,它内置于 Rails 3 中。如果您使用的是 bundler,运行 bundle exec rake ...
将确保您加载正确的 rake 和您的应用程序的相关依赖项。如果您不使用捆绑程序,则只需运行 rake ...
。
如果您要运行上述命令,请确保您已将环境设置为生产模式,或者在命令前加上 RAILS_ENV=production【参考方案3】:
好的 - 我遇到了同样的问题。我不想使用“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文件,这是最好的选择。 我必须在数组中包含我所有的 css 文件吗?如果我有 40 个 css 文件怎么办?【参考方案4】:capistrano 用户的快速解决方法是将这一行放到 Capfile 中
# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'
【讨论】:
【参考方案5】:对于所有正在阅读本文但对application.css
没有问题的人,而是使用他们的自定义 CSS 类,例如admin.css
、base.css
等
解决方案是如上所述使用
bundle exec rake assets:precompile
在样式表引用中只引用application.css
<%= stylesheet_link_tag "application", :media => "all" %>
因为资产管道会预编译 application.css 中的所有样式表。这也发生在开发中,因此在使用资产管道时使用任何其他引用都是错误的。
【讨论】:
【参考方案6】:我在我的开发环境中遇到了完全相同的错误。最后,为了修复它,我需要做的就是添加:
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 不再在正确的位置寻找资源,尽管我的设置之前一直运行良好。此更改解决了这个问题。 感谢您的解决方案。我试图在开发模式下测试一些东西,我很惊讶它说“application.css 没有预编译”,即使我已经预编译了资产并且目录中存在 public/assets/application.css。很惊讶他们没有像在生产中那样在开发中自动为您设置 config.assets.manifest..【参考方案7】:我也遇到过这个问题,在没有预编译的情况下尝试在生产环境中运行仍然会抛出未预编译的错误。我必须更改注释 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)
【讨论】:
只是想为以后遇到此问题的人澄清一下,您需要在上面更改的代码位于config/application.rb
【参考方案8】:
这里是快速修复:
如果您使用 capistrano,请将此添加到您的 deploy.rb:
after 'deploy:update_code' do
run "cd #release_path; RAILS_ENV=production rake assets:precompile"
end
上限部署
【讨论】:
【参考方案9】:我今天遇到了此错误消息,并想将解决方案发布到我的特定案例中。事实证明,我的问题是我的一个 css 文件缺少右括号,这导致文件无法编译。如果您有一个为生产环境设置所有内容(包括资产预编译)的自动化流程,则可能更难注意到这一点。
【讨论】:
【参考方案10】:一切都失败了……
我的解决方案是更改布局文件
= stylesheet_link_tag "reset-min", 'application'
到
= stylesheet_link_tag 'application'
它奏效了! (您可以将重置文件放在清单中。)
【讨论】:
【参考方案11】:在 Heroku 上解决此问题的另一种方法:确保您的 Rakefile 已提交并推送。
【讨论】:
【参考方案12】:在 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
【讨论】:
【参考方案13】:如果您认为您遵循了一切顺利但仍然不走运,请确保您/capistrano 在最后运行 touch tmp/restart.txt 或等效项。我在倒霉名单上,但现在:)
【讨论】:
【参考方案14】:您使用的 css 中可能有一个 syntax error
。
运行此命令
$ bundle exec rake assets:precompile RAILS_ENV=development --trace
它会给出异常,修复它,你就完成了。
谢谢
【讨论】:
以上是关于rails 3.1.0 ActionView::Template::Error(application.css 未预编译)的主要内容,如果未能解决你的问题,请参考以下文章
centos 6.5下安装mysql+nginx+redmine 3.1.0 笔记
Rails 3.1 中的 Rails.cache 错误 - TypeError: can't dump hash with default proc