Serve CoffeeScript from Sinatra
Sinatra is nice because it's super lightweight. This will allow you to make it do exactly what you want, nothing more. This is the opposite of Ruby on Rail's convention. Likewise, it takes just a bit more configuration to make Sinatra serve CoffeeScript as compared to Rails.
Sinatra and CoffeeScript
Surprisingly, there are no fantastic gems, at least that I could churn up in a few Google searches, that make serving CoffeeScript bone head easy. I found a few, such as the Sinatra Assetpack. It looked like serious overkill, and my Sinatra app is very small, so I wanted a quick and easy way to serve the static goods.
CoffeeScript Gem
Sinatra needs a Gem to compile the CoffeeScript. Put this line in your Gemfile
:
gem "coffee-script"
And run a:
$ bundle install
Public Directory
In my app, web.rb
is the main controller file. Next to that file, I have a directory structure like this:
public/
js/
coffee/
web.rb
By default, Sinatra will serve static assets out of this public
directory.
CoffeeScript Handler
I created the coffee
directory separate from the js
directory so that I could write this little handler in web.rb
:
get "/coffee/*.js" do
filename = params[:splat].first
coffee "../public/coffee/#{filename}".to_sym
end
This handler will pick up requests that match "/coffee/*.js", find the associated .coffee
file, compile it to JavaScript and serve it. I kept the file extension as .js
to help avoid handling any potential mime-type setting requirements. Obviously, this handler is simple and won't handle complicated cases. But that is also a plus.
CoffeeScript in Templates
In my Slim template, if I wanted to get the compiled contents of the file named myscripts.coffee
, I would write a script tag like this:
script src="/coffee/myscripts.js"
Sinatra. Coffee. Bam.