Olá amigos, alguma vez você já passou por esse erro: Sprockets::Rails::Helper::AssetNotPrecompiled. Hoje vou ensiná-los a como resolvê-lo.

Resposta rápida

Esse erro aconteceu porque você está usando algum asset CSS ou Javascript e não informou ao Rails que ele deve precompilar para você. Para fazer isso basta ir em app/config/initializers/assets.rb e adicionar o novo arquivo utilizado.

# app/config/initializers/assets.rb
Rails.application.config.assets.precompile += %w(
  users.css
  novo_arquivo.js
  // ... outros arquivos
)

E após isso, reiniciar o servidor.

Obs: perceba que o arquivo assets.rb esta dentro da pasta initializers, isso significa que esses arquivos foram carregado na inicialização do servidor e para qualquer alteração, o servido deverá ser reinicializado.

Agora, se você quiser uma explicação mais detalhada, é só continuar lendo este post.

Corrigindo o problema

Se você quiser saber um pouco mais com os assets se comportam no Rails, veja essa publicação: Como migrar um template HTML

Esse erro, sempre acontece quando utilizamos um arquivo CSS ou JS diferente de application.css e application.js e desejamos importá-lo em nossa view.

Assets not precompiled

Como na foto acima, queríamos usar o arquivo de estilo users.css, mas o Rails nos informou um erro. Para corrigir esse erro, basta adicionar 1 linha em assets.rb

# app/config/initializers/assets.rb
Rails.application.config.assets.precompile += %w(
  users.css
  // ... outros arquivos
)

Após feito, precisaremos reiniciar o server e o erro estará corrigido.

Informações adicionais

O erro já foi corrigido, mas queria passar mais 2 segundos para lhe dizer 2 coisas:

  • Assim como o arquivo assets.rb, a alteração de qualquer outro arquivo dentro de app/config/initializers é necessário a reinicialização do servidor para as alterações serem efetivadas. Sugestão: você pode adicionar códigos para serem executados na inicialização do server, como por exemplo, a definição de variáveis de ambiente, que comumente usamos para salvar tokens de acesso a API’s. (Em breve escreverei uma publicação sobre isso.)

  • Nem todo novo arquivo CSS é necessário ser adicionado em assets.rb. Por exemplo, digamos que dentro do arquivo user.css importado anteriormente tenha o seguinte código

// users.css

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require sb-admin-2
 *= require_tree .
 *= require_self
 */

o arquivo sb-admin-2.css não necessita ser adicionado, pois o “arquivo pai” já foi adicionado, ou seja, precisamos apenas adicionar o “arquivo pai” ou “arquivo agregador”, feito isso, o Rails é inteligente o suficiente para olhar dentro desse arquivo e ir pré-compilando os imports necessários.

#Fim