rails 3.1.0 ActionView :: Template :: Error (application.css não é pré-compilado)


281

Eu criei um aplicativo básico de trilhos com um simples controlador de páginas com uma função de índice e quando carrego a página, recebo:

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'

Gemfile

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
empacote os recursos do rake exec: pré-compilar parece corrigi-lo, mas por que não funciona?
— 9118 Chris Muench

10
Eu tenho o mesmo problema na produção, mesmo depois de executar pacote ativos ancinho exec: precompile
— Lucas Renan

Respostas:


313

Por padrão, o Rails supõe que você tenha seus arquivos pré-compilados no ambiente de produção, se desejar usar a compilação ao vivo (compilar seus ativos durante o tempo de execução) na produção, você deverá configurar o config.assets.compile como true .

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

Você pode usar esta opção para fazer o fallback para Sprockets quando estiver usando ativos pré-compilados, mas houver arquivos pré-compilados ausentes.

Se a config.assets.compileopção estiver configurada como false e houver arquivos pré-compilados ausentes, você receberá um "AssetNoPrecompiledError" indicando o nome do arquivo ausente.


3
Você pode querer experimentar o que este artigo diz: devcenter.heroku.com/articles/rails31_heroku_cedar (eu não tentei me até o momento)
— Chris Muench

7
Apenas para esclarecer, a opção config.assets.compile está em config / environment / production.rb (se você estiver trabalhando na produção). E se você quiser poder compilar ao vivo / lento na produção, também precisará habilitar a compilação lenta no application.rb.
— avioing 19/10/11

34
Ativar a compilação de tempo de execução não é a solução, devido ao desempenho que levamos. A solução é corrigir o problema principal que está impedindo a pré-compilação de ativos.
— David Tuite

5
Eu pré-compilei os ativos usando RAILS_ENV = exec rake assets do pacote de produção: pré-compilação. Por que estou recebendo esse erro e também preciso definir esse sinalizador?
— Tony

2
@ Tony, porque você provavelmente pede algo diferente do arquivo application.css / js / image e não o registrou application.rb. Adicionar a / edit application.rb: config.assets.precompile += %w( first.css second.js ). Agora esses arquivos serão compilados também. Não adicione todos os arquivos se você usá-los apenas em rodas dentadas require, mas só se você incluí-los com <link>/<script>
— elado

202

Você obterá melhor desempenho na produção se definir config.assets.compile como false em production.rb e pré-compilar seus ativos. Você pode pré-compilar com esta tarefa de rake:

bundle exec rake assets:precompile

Se você estiver usando o Capistrano, a versão 2.8.0 possui uma receita para lidar com isso no momento da implantação. Para obter mais informações, consulte a seção "Em produção" do Guia do pipeline de ativos: http://guides.rubyonrails.org/asset_pipeline.html


14
Eu não posso acreditar o quão difícil foi descobrir como fazer isso.
— precisa saber é o seguinte

3
Essa parece ser a opção claramente melhor: configurar compilação ao vivo como verdadeira "usa mais memória, apresenta desempenho inferior ao padrão e não é recomendado". guides.rubyonrails.org/asset_pipeline.html#live-compilation
— andrew.rockwell

rake -Tou bundle exec rake -Té seu amigo.
— Ryan

2
O @Underworld Bundler é uma ferramenta para gerenciar dependências de gemas em um aplicativo ruby ​​e está embutido no Rails 3. Se você estiver usando o bundler, a execução bundle exec rake ...garantirá que você esteja carregando o rake certo e as dependências associadas ao seu aplicativo. Se você não estiver usando o bundler, você apenas executaria rake ....
— richardsun

3
Se você estiver indo para executar o comando acima, certifique-se que você já está definido o seu ambiente para o modo de produção, ou prefixar o comando com RAILS_ENV = produção
— JESii

31

OK - eu tive o mesmo problema. Eu não queria usar "config.assets.compile = true" - tive que adicionar todos os meus arquivos .css à lista em config / environment / production.rb:

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

Então eu tive que criar (e depois excluir) tmp / restart.txt

Eu sempre usei o auxiliar stylesheet_link_tag, então encontrei todos os arquivos css extras que eu precisava adicionar:

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

Se você usar consultas de mídia e arquivos css diferentes para diferentes resoluções, esse é o melhor caminho a percorrer.
— precisa saber é o seguinte

1
Eu tenho que incluir todos os meus arquivos css na matriz? E se eu tiver 40 arquivos css?
— yozzz

30

Uma solução rápida para o usuário capistrano é colocar esta linha no Capfile

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

11

Para todos aqueles que estão lendo isso, mas não têm problemas application.csscom suas classes CSS personalizadas, por exemplo admin.css, base.cssetc.

A solução é usar como mencionado

bundle exec rake assets:precompile

E nas referências de folhas de estilo apenas referência application.css

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

Como o pipeline de ativos pré-compila todas as suas folhas de estilo em application.css. Isso também acontece no desenvolvimento, portanto, o uso de outras referências é errado ao usar o pipeline de ativos.


8

Eu estava tendo exatamente o mesmo erro no meu ambiente de desenvolvimento. No final, tudo o que eu precisava fazer para corrigi-lo foi adicionar:

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

para o meu arquivo config / environment / development.rb e o corrigiu. Minha configuração final no desenvolvimento relacionada a ativos é semelhante a:

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

Esta foi a única solução que funcionou para mim. Talvez tenha sido um problema com a minha versão do Rails (3.1.3)? De qualquer forma, eu poderia dizer que meus ativos foram pré-compilados com êxito em público / ativos e seus nomes de arquivos tinham os mesmos SHAs listados no manifest.yml. Por alguma razão, o Rails não estava mais procurando ativos no lugar certo, mesmo que minha instalação sempre funcionasse bem anteriormente. Essa mudança corrigiu isso.
— Antinome

Obrigado por esta solução. Eu estava tentando testar algumas coisas no modo de desenvolvimento e fiquei surpreso ao dizer "application.css não está pré-compilado", embora já tivesse pré-compilado ativos e public / assets / application.css estava presente no diretório Surpreso que config.assets.manifest não set para você automaticamente em desenvolvimento como eles fazem na produção ..
— Tyler Rick

5

Eu também tive esse problema, onde tentar executar a produção sem pré-compilar ainda geraria erros não pré-compilados. Eu tive que mudar qual linha foi comentada 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
Só quero esclarecer para quem vem através desta tarde, o código que você precisa para mudar acima está localizado noconfig/application.rb
— GMA

4

Aqui está a solução rápida:

Se você estiver usando capistrano, adicione isso ao seu deploy.rb:

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

cap deploy


2

Encontrei esta mensagem de erro hoje e queria postar a resolução em meu caso particular. Acontece que meu problema era que um dos meus arquivos css estava sem uma chave de fechamento e isso fazia com que o arquivo não fosse compilado. Pode ser mais difícil perceber isso se você tiver um processo automatizado que configure tudo (incluindo a pré-compilação de ativos) para o seu ambiente de produção.


1

Afinal, tudo falhou ...

Minha solução foi alterar o arquivo de layout de

= stylesheet_link_tag "reset-min", 'application'

para

= stylesheet_link_tag 'application'

E funcionou! (Você pode colocar o arquivo de redefinição dentro do manifesto.)


1

Apenas outra maneira de corrigir isso no Heroku: Verifique se o seu Rakefile está comprometido e pressionado.


0

No servidor heroku (sistema de arquivos somente leitura), se você quiser a compilação em tempo de execução do css (não é recomendado, mas você pode fazê-lo), verifique se você fez as configurações abaixo -

# 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

se você acha que seguiu tudo de bom, mas ainda assim azarado, certifique-se de executar o comando / capistrano tocando em tmp / restart.txt ou equivalente no final. Eu estava na lista de azar, mas agora :)


0

Você provavelmente tem um syntax errorno css que está usando.

Execute este comando

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

Isso dará a exceção, corrigiu isso e tudo está pronto.

obrigado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.