Padrino

Controllers

Custom Conditions

Padrino has support for Sinatra's custom route conditions as well. This allows you to apply custom condition checks to evaluate before a route is executed for an incoming request:

Demo::App.controllers :projects do
  def protect(*args)
    condition do
      unless username == 'foo' && password == 'bar'
        halt 403, 'Not Authorized'
      end
    end
  end

  get '/', protect: true do
    'Only foo can see this'
  end
end

Conditions can also be specified at the controller and route levels:

# You can specify conditions to run for all routes:
Demo::App.controllers :projects, conditions: { protect: true } do
  def self.protect(protected)
    condition do
      halt 403, 'No secrets for you!' unless params[:key] == 's3cr3t'
    end if protected
  end

  # This route will only return "secret stuff" if the user goes to
  # `/private?key=s3cr3t`.
  get('/private') { 'secret stuff' }

  # And this one, too!
  get('/also-private') { 'secret stuff' }

  # But you can override the conditions for each route as needed.
  # This route will be publicly accessible without providing the
  # secret key.
  get :index, protect: false do
    'Welcome!'
  end
end

This gives the developer considerable power to construct arbitrarily complex route conditions and apply them to any route within their application.

last updated: 2025-12-02

comments powered by Disqus