We love Sinatra. Not only does it make a great framework in its own right but in addition it can be used to mimic parts of rails in a real simple environment for front-end designers. Instead of having to get them set up and explain the whole of rails they just get a nice simple app to work on without having to worry about creating different controllers or even models.
Although there is not a 1 to 1 translation between a rails app and a sinatra one, it does allow these developers to work with things like haml in a really easy to work with environment.
One of the features that I was asked for recently though was “How do you render a partial in sinatra?”
Rendering Partials in Sinatra
Sinatra is a super-lightweight framework. Because of this it doesn’t have the notion of partials built into it. However, a partial, in its simplest form, is nothing more than a call out to render the template as a string and then embed that string into your page.
A quick look at the sinatra sites FAQs shows that partials can be rendered in the following way in erb.
<%= erb(:mypartial, :layout => false) %>
In haml you could use exactly the same thing but call haml like so.
= haml(:mypartial, :layout => false)
Notice that
:layout => false
is set to ensure that the layout is not also rendered.
Going a little further
The FAQs also recommend using the code in the following gist.
The code shows a helper method called partial. This helper method can be used to render a partial from your code. The helper also allows you to pass collections and is a really cool and useful piece of code.
Making things work the rails way
The above helpers are great and really useful for sinatra. However, what if you want to render a partial the ‘rails way’? In our situation we were using sinatra as a mock up of what would eventually be brought into a rails app. Rails allows partials to be included like so:
<%= render :partial => 'partial_name' %>
By overriding the built in render method in Sinatra it is actually possible to mimic the rails partials. I came up with the following helper to quickly mock things up. The helper checks to see if the first argument passed to is a hash and if that contains they key :partial. If so it renders the partial, if not it just uses the default render method.
helpers do def render(*args) if args.first.is_a?(Hash) && args.first.keys.include?(:partial) return haml "_#{args.first[:partial]}".to_sym, :layout => false else super end end end
The helper could easily by extended to allow for collections etc but for now it does the job. Any better solutions?
You can take a look at the Padrino implementation of a partial here: http://github.com/padrino/padrino-framework/blob/master/padrino-helpers/lib/padrino-helpers/render_helpers.rb . This has support for collections, objects, locals, counters, etc.
That gist is now available as a gem, with some updates and helpful additions: https://rubygems.org/gems/sinatra-partial