Durante minha aventura de colocar uma aplicação Rails em produção em uma url com prefixo (www.sistemas.com/meu, por exemplo) quase tudo estava funcionando bem, até que eu visitei a interface gerada pelo rails_admin. Algumas imagens estavam perdidas, mas outras estavam no lugar, um verdadeiro pandemônio. Com uma verificada rápida no html, notei que algumas urls para imagens não estavam com o prefixo da url, mas por que outras estavam? Um detalhe importante: somente as imagens definidas via CSS estavam com a url errada, todas as outras estavam normais.
Googleada aqui, googleada lá… encontrei uma ask no Stack Overflow sobre tal problema no Rails 3.1. Não gostei muito do método utilizado pra resolver o problema, que era um bug na gem sass-rails e esperava que no 3.2 já estivesse resolvido. Atualizei minha versão do Rails para a 3.2.6, que era a 3.1 e nada. Aproveitei um link para a issue sobre este bug no projeto da gem. Nesta issue é explicado muito bem o que causa o problema e é disponibilizado um monkey patch pra resolver no Rails 3.1. Também tem um link para uma pull request que resolve o problema no Rails 3.2, mas adiciona um passo extra para fazer deploy da aplicação: definir na variável de ambiente RAILS_RELATIVE_URL_ROOT a url usada como prefixo antes de compilar os assets. Então, na hora de compilar os assets ficaria assim:
$ RAILS_RELATIVE_URL_ROOT='/meu_prefixo' rake assets:compile
Quem usa o Capistrano para fazer deploy, como eu, basta adicionar esta linha em algum lugar do config/deploy.rb:
default_environment["RAILS_RELATIVE_URL_ROOT"] = "/meu_prefixo"
Se você usa Rails 3.1, além da variável da ambiente, você deverá criar um arquivo na pasta initializers (com o nome que quiser) e colocar o monkey patch nele:
module Sass
module Rails
module Helpers
protected
def public_path(asset, kind)
resolver = options[:custom][:resolver]
asset_paths = resolver.context.asset_paths
path = resolver.public_path(asset, kind.pluralize)
if !asset_paths.send(:has_request?) && ENV['RAILS_RELATIVE_URL_ROOT']
path = ENV['RAILS_RELATIVE_URL_ROOT'] + path
end
path
end
end
end
end