Obtenha seus recursos do Rails 3.2 para pré-compilar no Heroku

Nota no Rails 4

A partir do Rails 4, este protocolo não é mais relevante.

Veja https://devcenter.heroku.com/articles/rails4-getting-started#rails-asset-pipeline

Compilar seus ativos em tempo de execução pode tornar as coisas lentas. Mantenha seu aplicativo ágil, certificando-se de que o Heroku pré-compila seus ativos durante a compilação do slug.

O problema

Quando o Rails compila ativos, por padrão, requer que um ambiente esteja presente para inicializar. Este é um problema no Heroku porque os vars de configuração não estão presentes no ambiente na compilação slug. Isso evita que o banco de dados seja inicializado.

É por isso que provavelmente você está vendo algo assim:

could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP
/IP connections on port xxxx?

A solução

Para que seus ativos sejam pré-compilados no Heroku, tudo que você precisa fazer é dizer ao Rails para não inicializar durante a pré-compilação. Você pode fazer isso simplesmente adicionando esta linha em seu application.rbarquivo:

config.assets.initialize_on_precompile = false

PS

Se você tiver quaisquer ativos que precisam ser pré-compilados, mas não estão incluídos em seus manifestos de ativos (application.css, application.js), você precisará adicioná-los à opção config.assets.precompile.

config.assets.precompile = %w( blah.js bleh.css )

Geralmente, isso ocorre devido a ativos que precisam ser carregados condicionalmente e, portanto, não podem residir em um manifesto global. Por exemplo:

<!--[if lt IE 9]>
= javascript_include_tag "html5shiv"

= javascript_include_tag "css3-mediaqueries

<![endif]-->

Nesse caso, html5shiv.js e css3-mediaqueries.js seriam incluídos na opção config.assets.precompile.

PPS

O que é isso? Você tem vars de configuração em seu arquivo coffee.js.erb? Sim, isso é um problema. Conforme declarado acima, seu aplicativo não tem acesso ao ambiente quando seus ativos estão sendo pré-compilados. Portanto, nenhum acesso aos vars de configuração. No entanto, o Heroku possui um pequeno recurso experimental prático chamado user-env-compile que fornecerá vars de configuração para o ambiente durante o tempo de compilação. Agora você pode usar vars de configuração em seus ativos sem se preocupar.

Uma palavra de advertência de Heroku!

Os recursos adicionados por meio dos laboratórios são experimentais e podem ser alterados ou removidos sem aviso prévio.

Para habilitar:

heroku labs:enable user-env-compile -a myapp

Desabilitar:

heroku labs:disable user-env-compile -a myapp

https://devcenter.heroku.com/articles/labs-user-env-compile

https://devcenter.heroku.com/articles/rails3x-asset-pipeline-cedar