コントローラのアクションに対応したURLに接続することができます。たとえば、config/routes.jsファイルに以下のように記述します。

map.get('signup', 'users#new');

これはusersコントローラのnewアクションをGET /signupにリンクさせます。

map.root('home#index');

これはhomeコントローラのindexアクションをGET /にリンクします。

リソースベースのルーティング

HTTP動詞と、コントローラのアクション間のスタンダードなマッピングを提供します。

map.resources('posts');

これは下記のようなルートを提供します。

   helper | method | path                   | controller#action
---------------------------------------------------------------
     posts GET      /posts                   posts#index
     posts POST     /posts                   posts#create
  new_post GET      /posts/new               posts#new
 edit_post GET      /posts/:id/edit          posts#edit
      post DELETE   /posts/:id               posts#destroy
      post PUT      /posts/:id               posts#update
      post GET      /posts/:id               posts#show

railway routesコマンドによりルーティング定義一覧を見ることができます。テーブルの最初のカラムはhelper(この識別子によりビュー、コントローラのルートを使用可能です)です。例えば、下記の通りです。

path_to.new_post            # /posts/new
path_to.edit_post(1)        # /posts/1/edit
path_to.edit_post(post)     # /posts/1/edit (in this example post = {id: 1})
path_to.posts               # /posts
path_to.post(post)          # /posts/1

リソースフルなルートのエイリアス

標準のルートの動作を上書きしたい場合には、2つのオプションを使用することができます。(ヘルパー名の指定、パスの指定をする為の、asとpath)

{ as: ‘helperName’ }
パスのエイリアス:

map.resources(‘posts’, {as: ‘articles’});
これは以下が提供されます。

     articles GET    /posts.:format?          posts#index
     articles POST   /posts.:format?          posts#create
  new_article GET    /posts/new.:format?      posts#new
 edit_article GET    /posts/:id/edit.:format? posts#edit
      article DELETE /posts/:id.:format?      posts#destroy
      article PUT    /posts/:id.:format?      posts#update
      article GET    /posts/:id.:format?      posts#show

{ path: ‘alternatePath’ }
パスの変更:

map.resources('posts', {path: 'articles'});

これは以下のルートが作成されます。

     posts GET    /articles.:format?          posts#index
     posts POST   /articles.:format?          posts#create
  new_post GET    /articles/new.:format?      posts#new
 edit_post GET    /articles/:id/edit.:format? posts#edit
      post DELETE /articles/:id.:format?      posts#destroy
      post PUT    /articles/:id.:format?      posts#update
      post GET    /articles/:id.:format?      posts#show

{as ‘helperName, path: ‘alernatePath’}
ヘルパーとパス両方使用したい場合には、以下のように指定します。

map.resources('posts', {path: 'articles', as: 'stories'});

以下の通り取得できるでしょう。

    stories GET    /articles.:format?          posts#index
    stories POST   /articles.:format?          posts#create
  new_story GET    /articles/new.:format?      posts#new
 edit_story GET    /articles/:id/edit.:format? posts#edit
      story DELETE /articles/:id.:format?      posts#destroy
      story PUT    /articles/:id.:format?      posts#update
      story GET    /articles/:id.:format?      posts#show

ネストされたリソース

リソースは、ネストされたサブリソースを持つことができます。例えば、PostはたくさんのCommentsを持ちますが、GET /post/1/commentsのようにして任意のコメントを取得したいでしょう。

ネストされたリソースのルートは以下のように記述します。

map.resources('post', function (post) {
    post.resources('comments');
});

このルーティングマップは以下のようなルートを提供します。

$ railway routes
     post_comments GET      /posts/:post_id/comments          comments#index
     post_comments POST     /posts/:post_id/comments          comments#create
  new_post_comment GET      /posts/:post_id/comments/new      comments#new
 edit_post_comment GET      /posts/:post_id/comments/:id/edit comments#edit
      post_comment DELETE   /posts/:post_id/comments/:id      comments#destroy
      post_comment PUT      /posts/:post_id/comments/:id      comments#update
      post_comment GET      /posts/:post_id/comments/:id      comments#show
             posts GET      /posts                            posts#index
             posts POST     /posts                            posts#create
          new_post GET      /posts/new                        posts#new
         edit_post GET      /posts/:id/edit                   posts#edit
              post DELETE   /posts/:id                        posts#destroy
              post PUT      /posts/:id                        posts#update
              post GET      /posts/:id                        posts#show

ネストされたルートのurlヘルパーを使う

post_commentsのようなルートを使用する為には、親リソースのパス、もしくは識別子が必要となります。

path_to.post_comments(post)               # /posts/1/comments
path_to.edit_post_comment(post, comment)  # /posts/1/comments/10/edit
path_to.edit_post_comment(2, 300)         # /posts/2/comments/300/edit

名前空間

名前空間によってコントローラのグループを管理することができます。最もよく使われるのはadmin空間でしょう。名前空間admin以下全てのコントローラはapp/controllersディレクトリ以下に配置する必要があります。

例として、名前空間adminを使用してみましょう。

namespace('admin', function (admin) {
    admin.resources('users');
});

この定義により/admin/users、/admin/users/newなどのURLとマッチさせることができ、urlヘルパー作成されます。

      admin_users GET    /admin/users.:format?          admin/users#index
      admin_users POST   /admin/users.:format?          admin/users#create
   new_admin_user GET    /admin/users/new.:format?      admin/users#new
  edit_admin_user GET    /admin/users/:id/edit.:format? admin/users#edit
       admin_user DELETE /admin/users/:id.:format?      admin/users#destroy
       admin_user PUT    /admin/users/:id.:format?      admin/users#update
       admin_user GET    /admin/users/:id.:format?      admin/users#show

ルーティングの制限

いくつかのアクション(例えば、indexや、show)のみにルートを制限したい場合にはonlyオプションを指定すればよいでしょう。

map.resources('users', {only: ['index', 'show']});

いくつかのルートを除き全てのルートを持たせたい場合にはexceptオプションを指定します。

map.resources('users', {except: ['create', 'destroy']});

リソースフルなルートのカスタマイズ

特定のアクションが必要な場合には、リソースにより生成されたルートに追加します。例えば、下記のように定義することができます。

map.resources('users', function (user) {
    user.get('avatar', 'users#avatar');
});