Rails version 3.1 introduced the assets pipeline as a way to properly organize and serve static assets. We are adding assets pipeline support for Rails applications deployed on CloudFoundry.com. Assets pipeline includes compression, ERB evaluation, Javascript and CSS processing using Rails 3.1 Sprockets library. In development mode, assets precompilation is not required – Rails turns on live compilation if it can’t find precompiled assets. In production mode, live compilation is disabled by default. One of the ways to make this work on Cloud Foundry is to bundle assets with your application before you push. Now CloudFoundry.com also provides assets precompilation as one of the steps of application pre-processing.
Bundle assets locally
Rails provides a rake task to compile and bundle assets with your app. You can prepare them locally for production by running:
RAILS_ENV=production bundle exec rake assets:precompile
This task discovers all the assets included in the application, pre-compiles them and saves compiled versions in public/assets directory by default as well as manifest.yml which contains the list of compiled assets with their digest.
Assets compilation on Cloud Foundry
In order to run this in CloudFoundry.com we had to implement some additional pre-processing when the application is staged. First, Cloud Foundry assumes that assets were compiled locally via an assets manifest. If the assets manifest is not found, Cloud Foundry runs the “assets:precompile” rake task during staging. Later, when the application is being run on the DEA (the container for Cloud Foundry apps) we have all the assets. These can be statically served with the digest and other magic that Rails adds to these files.
Live compilation
One potential problem can occur during application initialization. The precompile rake task runs a complete initialization of the Rails application. This might trigger some of the initialization procedures and require service connections and environment checks that are unavailable during staging. You can turn this off by adding a configuration option in application.rb:
config.assets.initialize_on_precompile = false
If the assets:precompile task fails, Cloud Foundry makes use of live compilation mode which is the alternative to assets precompilation. In this mode assets are compiled when they are loaded for the first time. This is done by injecting a plugin to Rails application that forces live compilation process.
Rails.application.config.assets.compile = true
Example
Let’s create a simple Rails application that makes use of CoffeeScript.
rails new coffee-app cd coffee-app rails generate controller Hello index
Let’s add some CoffeeScript to app/assets/javascripts/hello.js.coffee file:
name = "CoffeeScript" alert "Hello from #{ name }!"
If we start our application with “rails server” and browse,
http://localhost:3000/hello/index
we would see “Hello from CoffeeScript!”. This works in development mode without the need for assets precompilation. In production, Rails serves only precompiled static assets and does not fall back to assets pipeline which is disabled in production.rb:
config.assets.compile = false
With the support of assets precompilation we can push this application to CloudFoundry.com without any modifications.
vmc push coffee-app
If we go to http://coffee-app.cloudfoundry.com we would see our popup message as expected. By taking advantage of these features, your Rails 3.1+ applications will properly precompile all your SASS, Coffee Script and ERB assets as intended.
– Maria Shaldibina The Cloud Foundry Team
About the Author