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.