---
layout: post
title: What is a router?
type: beginner
posturl: http://backbonetutorials.com/what-is-a-router
---
# What is a router?
Backbone routers are used for routing your applications URL's when using hash tags(#). In the traditional MVC sense they don't necessarily fit the semantics and if you have read "[What is a view?](http://backbonetutorials.com/what-is-a-view)" it will elaborate on this point. Though a Backbone "router" is still very useful for any application/feature that needs URL routing/history capabilities.
Defined routers should always contain at least one route and a function to map the particular route to. In the example below we are going to define a route that is always called.
Also note that routes interpret anything after "#" tag in the URL. All links in your application should target "#/action" or "#action". (Appending a forward slash after the hashtag looks a bit nicer e.g. http://example.com/#/user/help)
{% highlight html %}
{% endhighlight %}
[Activate route](#action)
[Activate another route](#/route/action)
_Notice the change in the url_
## Dynamic Routing
Most conventional frameworks allow you to define routes that contain a mix of static and dynamic route parameters. For example you might want to retrieve a post with a variable id with a friendly URL string. Such that your URL would look like "http://example.com/#/posts/12". Once this route was activated you would want to access the id given in the URL string. This example is implemented below.
{% highlight html %}
{% endhighlight %}
[Post 120](#/posts/120)
[Post 130](#/posts/130)
_Notice the change in the url_
## Dynamic Routing Cont. ":params" and "*splats"
Backbone uses two styles of variables when implementing routes. First there are ":params" which match any URL components between slashes. Then there are "*splats" which match any number of URL components. Note that due to the nature of a "*splat" it will always be the last variable in your URL as it will match any and all components.
Any "*splats" or ":params" in route definitions are passed as arguments (in respective order) to the associated function. A route defined as "/:route/:action" will pass 2 variables (“route” and “action”) to the callback function. (If this is confusing please post a comment and I will try articulate it better)
Here are some examples of using ":params" and "*splats"
{% highlight javascript %}
routes: {
"posts/:id": "getPost",
// Example
"download/*path": "downloadFile",
// Download
":route/:action": "loadView",
// Load Route/Action View
},
app_router.on('route:getPost', function( id ){
alert(id); // 121
});
app_router.on('route:downloadFile', function( path ){
alert(path); // user/images/hey.gif
});
app_router.on('route:loadView', function( route, action ){
alert(route + "_" + action); // dashboard_graph
});
{% endhighlight %}
Routes are quite powerful and in an ideal world your application should never contain too many. If you need to implement hash tags with SEO in mind, do a google search for "google seo hashbangs". Also check out [Seo Server](http://seo.apiengine.io)
Remember to do a pull request for any errors you come across.
### Relevant Links
* [Backbone.js official router documentation](http://documentcloud.github.com/backbone/#Router)
* [Using routes and understanding the hash tag](http://thomasdavis.github.com/2011/02/07/making-a-restful-ajax-app.html)
### Contributors
* [Herman Schistad](http://schistad.info) - (Backbone 0.5 rename from Controller to Router)
* [Paul Irish](http://paulirish.com)