
Security News
Astral Launches pyx: A Python-Native Package Registry
Astral unveils pyx, a Python-native package registry in beta, designed to speed installs, enhance security, and integrate deeply with uv.
Sinatra-rroute provides Rails-like routes for Sinatra. Using one of the
gget
/ppost
/ddelete
/... methods, a route is assigned a name, is mapped
to a controller-like method and has a mask to be used by the provided
path
helper function. The path
helper takes the name of a route, a set
of keyword-value mappings, applies them to the mask and gives back the
route with each keyword replaced by the associated value.
Routes can also be namespaced. Namespaces can be nested. There can be multiple namespaces per app.
Include sinatra-rroute
in your Gemfile:
gem 'sinatra-rroute'
Require it in your Sinatra app:
require 'sinatra/rroute'
Register it in your app:
register Sinatra::Rroute
Mapping routes to controller-like methods works by calling one of the sinatra-rroute mapping methods like so:
# This will call Sinatra's `get' method behind the scenes.
gget '/[uU]ser/:name/:age/?' => :user_info, :as =>
:user, :mask => '/user/:name/:age/'
# This will call Sinatra's `post' method behind the scenes.
ppost '/[uU]ser/new/:name/:age/?' => :create_user, :as =>
:new_user, :mask => '/user/new/:name/:age/'
The above examples will map GET requests for routes matching the RegEx
'/[uU]ser/:name/:age/?'
to the function user_info
and POST requests to
the route matching the RegEx '/[uU]ser/new/:name/:age/?'
to the function
:create_user. The first route can be referenced as user
, the second one
as new_user
.
Here are all the supported mapping methods and their associated HTTP
methods (all of them have the same signature, e.g.
gget('/route/regex/?' => :controller_method, :as => :route_name, :mask => '/route/mask/')
):
| Rroute Method | HTTP Method |
|---------------+-------------|
| gget | GET |
| ppost | POST |
| pput | PUT |
| ppatch | PATCH |
| hhead | HEAD |
| ddelete | DELETE |
| ooptions | OPTIONS |
| llink | LINK |
| uunlink | UNLINK |
| ttrace | TRACE |
| cconnect | CONNECT |
The validity of some of those HTTP methods may be debatable, but it is nice to have them, nonetheless, in case you might need them one day.
If you do not want to map routes to methods, but still give them names and
masks, you can use the mmap
function in combination with Sinatra's
built-in get
/post
/delete
/... functions:
# Signature: mmap(regex, mask, name)
get mmap('/user/:name/?', '/user/:name/', :user_info) do
# ...
end
Referencing controllers...
...works in two ways. Either they are referenced using
symbols for simple class/module level or global controllers or they are
referenced using strings representing nested controllers similar to the
:to
option of Rails' get
/post
/... routing methods:
# Symbol reference
gget '/[uU]ser/:name/:age/?' => :user_info, :as =>
:user, :mask => '/user/:name/:age/'
# String reference to nested controller (instance method)
gget '/[uU]ser/:name/:age/?' => 'Very::Deeply::Nested#controller',
:as => :user, :mask => '/user/:name/:age/'
# String reference to nested controller (class method)
gget '/[uU]ser/:name/:age/?' => 'Very::Deeply::Nested::controller',
:as => :user, :mask => '/user/:name/:age/'
String references can point to either instance methods or class methods. For instance methods, the class is automatically instanciated and the method is called on this anonymous instance. So arguments can not be supplied for this instance (this would arguably be bad controller design anyway). Unlike with Rails,
'UpperCase::DeeplyNested::controller'
), but'One::Two::Three::Four::Five::Six::Seven#controller'
).Have in mind, that for sinatra-rroute to be able to reach controllers,
the controllers already have to be defined, i.e. modules/classes have to be
required before being referenced in a gget
/ppost
/mmap
call.
Sinatra-rroute comes with a nnamespace
method which takes the name of a
namespace and a block. Each route specified using one of the sinatra-rroute
mapping functions (gget
/ppost
/ddelete
/, also mmap
) inside the block
will be prefixed by the specified namespace prefix. Sinatra's built-in
get
/post
/delete
/... functions can be used within a namespace block,
but are not affected by the namespacing. Namespaces can be nested.
Prefixes do have to specify leading and/or trailing slashes explicitely!
Here is an example:
nnamespace '/api' do
nnamespace '/v1' do
gget '/[uU]ser/:name/:age/?' => :user_info, :as =>
:user, :mask => '/user/:name/:age/'
ppost '/[uU]ser/new/:name/:age/?' => :create_user, :as =>
:new_user, :mask => '/user/new/:name/:age/'
end
gget '/documentation/?' => :api_documentation, :as =>
:api_docs, :mask => '/documentation/'
end
Sinatra-rroute comes with a path
helper function. It takes the name of a
route and a hash of key-value mappings and returns the path for that route
according to its mask. Each "token" in a mask will be replaced by the value
for the specified key in the mapping.
# Specify a route mapping.
gget '/[uU]ser/:name/:age/?' => :user_info, :as =>
:user, :mask => '/user/:name/:age/'
# Redirect to this route.
get '/friend/:name/:age/?' do
redirect to(path(:user, :name => params[:name], :age =>
params[:age]))
end
# Generate a link for the route in the view.
<a href="<%= path(:user, :name => 'John', :age => 32) %>">Get user info</a>
# This will render the following link:
# <a href="/user/John/32/">Get user info</a>
The helper can be used in your view files as well as in your controller/model/application. It is handy for links, redirecting etc.
The full hash of all route-method mappings is attached to your Sinatra
app's settings
object available through the settings.app_paths
variable.
Note: The full list of all routes is only available after the last call of one of the sinatra-rroute mapping methods, of course.
Note: When mixing sinatra-rroute mapping methods
(gget
/ppost
/delete
/mmap
/...) and Sinatra's built-in
get
/post
/delete
/... the routes defined using the Sinatra built-ins
will not show up in settings.app_paths
!
Sinatra's built-in get
/post
/delete
/... functions as well as other
route-related extensions do work fine in combination with sinatra-rroute as
long as they do not
settings.app_paths
variable of your Sinatra app,get
/post
/delete
functions
without letting sinatra-rroute know orrroute_call_nested_controller_from_string
method which handles nested
controller references.The names are
FAQs
Unknown package
We found that sinatra-rroute demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Astral unveils pyx, a Python-native package registry in beta, designed to speed installs, enhance security, and integrate deeply with uv.
Security News
The Latio podcast explores how static and runtime reachability help teams prioritize exploitable vulnerabilities and streamline AppSec workflows.
Security News
The latest Opengrep releases add Apex scanning, precision rule tuning, and performance gains for open source static code analysis.