HasScope equivalent for Sinatra
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Sinatra HasScope

Sinatra HasScope is a Sinatra adaptation of the very useful HasScope Rails library.

Sinatra HasScope allows you to easily create filters based on your resources named scopes. Imagine the following model called Graduation:

class Graduation < ActiveRecord::Base
  scope :featured, where('featured = ?', true)
  scope :by_degree, lambda { |degree| { where('degree = ?', degree) } }

You can use those named scopes as filters by declaring them on your routes:

class MyApp < Sinatra::Base
  has_scope :gradutation, :featured, :type => :boolean
  has_scope :gradutation, :by_degree
  has_scope :gradutation, :by_period, :using => [:started_at, :ended_at]

Now, if you want to apply them to an specific resource, you just need to call apply_scopes:

get '/graduations' do
  @graduations = apply_scopes(:graduation, Graduation, params).all

Then for each request:

#=> acts like a normal request

#=> calls the named scope and bring featured graduations

#=> brings featured graduations with phd degree

#=> brings graduations in the given period


Sinatra HasScope is available as gem on Gemcutter, so just run the following:

sudo gem install sinatra-has_scope

To install it with bundler, use:

gem 'sinatra-has_scope', :require => 'sinatra/has_scope'


HasScope supports several options:

  • :type - Checks the type of the parameter sent. If set to :boolean it just calls the named scope, without any argument. By default, it does not allow hashes or arrays to be given, except if type :hash or :array are set.

  • :as - The key in the params hash expected to find the scope. Defaults to the scope name.

  • :using - The subkeys to be used as args when type is a hash.

  • :if - Specifies a method, proc or string to call to determine if the scope should apply.

  • :unless - Specifies a method, proc or string to call to determine if the scope should NOT apply.

  • :default - Default value for the scope. Whenever supplied the scope is always called.

  • :allow_blank - Blank values are not sent to scopes by default. Set to true to overwrite.

Bugs and Feedback

If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.