Precompiling Assets With Relative Paths in Rails 3.1

We recently ran into an issue precompiling assets in Rails 3.1 for production. By default, Rails 3.1′s rake:assets:precompile task jams assets into a /assets directory. This works for simple deployments, but when deployed in Tomcat (or most application containers) some root context is applied to the application path.

For example – when running against rails server the URL to your application might look something like:

http://localhost:3000/users

When deployed, it might look something like:

http://localhost:10000/my-awesome-app/users

What you’ll find is your deployed app can’t find any assets since it’s looking in /assets and not /my-awesome-app/assets. You can read more about the issue here.

A quick solution is to use the rake task suggested by atambo that forces a relative path for your assets directory (from the issue thread):

 namespace :assets do
   desc "Make all embedded assets in stylesheets relative paths"
   task :relativize => :environment do
     Dir[Rails.root.join("public/assets") + "*.css"].each do |asset|
       contents = File.read(asset)
       File.open(asset, "w") do |file|
         file.puts contents.gsub("url(/assets/", "url(")
       end
     end
   end
 end
 

Add this rake task to your Rakefile and make sure to run it after precompiling your assets. It’s not ideal, but it’s a simple workaround for an issue that exists in Rails 3.1. It appears to have been fixed in 3.2 but updating Rails was not an option for us at the time.


Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>