7. Routing
It’s possible to map URLs by the configuration files for Routing.
URLs are restricted to the routes only declared in route.yml.
Configuring A Route For Home Page
You have just one route and is for homepage after generating an application.
preference/your_environment/route.yml
WelcomeHandler:
path: /
execute: index
template: welcome/index
css: /css/welcome.css
page-title: Welcome
WelcomeHandler is a Handler that will be used on the above route.
Handler is explained this chapter.
The above route matches http://example.com or http://example.com/.
css and page-title are custom fields. Custom fields will be assigned into your template files automatically.
It’s possible to reference the above value by {{field-name}} in your template files. e.g. {{css}}, {{page-title}}
The Required Directive
| name | type | description | default value | example value |
|---|---|---|---|---|
| path | string | A URL path pattern for a route. | - | /path/to/something |
The values on path directive will be converted to regular expression.
| value on path | converted to |
|---|---|
| / | /^\/?$/ |
| /foo | /^\/foo$/ |
| /path/to/:something/foo/:id | /^\/path\/to\/\w+/foo/\w+$/ |
The Optional Directives
path directive is the required though, there are some optional directives for routes.
| name | type | description | default value | example value |
|---|---|---|---|---|
| execute | string | A method to call in a route. | - | index |
| method | string | A HTTP request method which is accepted in a route. | - | post |
| content | string | A Content-type of response body. You must choose from following words, ‘html’, ‘json’, ‘xml’, ‘plain’. Default is ‘html’. If you set invalid words, The reponse body format will be set ‘plain’. | html | json |
| template | string | A template name to render in a route. e.g. setting ‘home/mypage’ to searching ‘template/home/mypage.tpl’. |
- | home/mypage |
| layout | string | A layout name. e.g. setting ‘common’ to searching ‘template/layout/common.tpl’. |
- | common |
| page_cache_time | int | Setting an integer in seconds to turning on page caching. More information please see 14. Page Caching. | - | 3600 |
| include | string | Includes a group of the directives from route_include.yml. | - | common |
Configuring Multiple Pathes
It’s possible to set multiple paths by regular expression.
preference/environment_name/route.yml
FooHandler
path: /(foo|bar|baz)
execute: index
The above route matchs on following URLs http://example.com/foo or http://example.com/bar or http://example.com/baz.
It’s possible to use the same Handler again any times you want.
FooHandler
path: /foo
execute: index
FooHandler
path: /bar
execute: index
FooHandler
path: /baz
execute: index
Configuring Routes
This is a tutorial to configure routes.
1. First, setting a Handler class to use in a route.
FooHandler:
There is a need to create FooHandler, but let's put that aside for now.
2. Filling ‘path’ directive
FooHandler:
path: /foo
path directive is the required. It's supposed to be set in each of routes.
path is supposed to be started from slash.
3. Setting the Handler’s method
FooHandler:
path: /foo
execute: do_something
You can set template and/or layout in your Handlers but it’s possible to set them by the directives.
FooHandler:
path: /foo
execute: do_something
template: article/index
layout: default
Requesting http://example.com/foo matchs this route and the method named foo in FooHandler will be called.
template/article/index.tpl and template/layout/default.tpl will be rendered.
Custom Fields
Anything not listed in the above directives are special. That will be assigned in your template files automatically.
Example
Setting Custom Fields
FooHandler:
path: /foo
name: Luna
state: kittien
handler is the reserved word for route_error.yml.
Referencing Custom Fields In Liquid templates
Output is => {{name}} is {{state}}.
The above string will be replaced to Output is => Luna is kittien.
Referencing Custom Fields In Handler
Custom Fields has been set in @custom_fields.
class FooHandler < BaseHandler
def index
p @custom_fields #=> {"name"=>"Luna", "state"=>"kittien"}
end
end
Empty Hash object will be set in @custom_fields in case of no Custom Fields given.
URL Path Parameters
It’s possible to get input from URL paths. Staring from : in path directive is special.
Just for instance,
preference/environment_name/route.yml
ArticleHandler:
path: /article/:user_id/:id
execute: index
method: get
content: json
There is a need to generate ArticleHandler.
Creating ArticleHandler
$ nekonote new handler article #=> handler/article.rb will be generated
The above route matches http://example.com/article/99/2002.
Nekonote::Request class object is set to a property named @request.
You can reference the values from URL by @request.path_params.
handler/article.rb
class ArticleHandler < BaseHandler
def index
@request.path_params #=> {"user_id"=>"99", "id"=>"2002"}
@request.path_params 'user_id' #=> 99
@request.path_params :id #=> 2002 # symbol is OK as well
@request.path_params 'not-defined' #=> nil
end
end
Configuring Common Preferences
route_include.yml is supposed to configure a group of some common preferences to configure routes in route.yml.
preference/your_environment/route_include.yml
article:
content: json
preference/your_environment/route.yml
GetHandler:
path: /get
execute: get
include: article
EditHandler:
path: /add
execute: add
method: post
include: article
EditHandler:
path: /sort
execute: sort
method: post
include: article
The directives in route.yml take precedence.