by Paul Pilone

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.