A method condition for Sinatra
With Sinatra before and after filters are easy. Adding conditions to these filters is also easy but what if I want to only execute a filter if the request type is POST for example? Of course, what I want to do didn’t exist so here I show you how to create your own filter conditions.
Existing pre/post filters in Sinatra are pretty easy:
before do puts "Always do this before routes" end before '/hello' do puts "Always do this before /hello" end after '/abc/xyz' do puts "You visited /abc/xyz" end
You can also use existing conditions just like routes on these filters:
before :agent => /LaLaBrowser/ do puts "Special stuff for this crazy browser." end
But, as usual, a condition didn’t exist (that I could find!) to accomplish my task… execute a filter based on the HTTP request method. Thus, I came up with this simple solution creating my own condition method:
module Sinatra class Base private def self.request_method(*meth) condition do this_method = request.request_method.downcase.to_sym if meth.respond_to?(:include?) then meth.include?(this_method) else meth == this_method end end end end end
This allows me to perform filters only for post, put or delete operations for example:
before :request_method => :post do stop 404 unless csrf_valid? end
Or a list of possible method types:
before :request_method => [ :post, :put, :delete ] do puts "blah blah blah" end
I was really surprised not to find this in Sinatra, so if I’ve missed it please let me know!