ルーティングとは?
どのURLへどのHTTPメソッドでアクセスされたらどのコントローラやアクションを呼び出したいか設定することです。
config/routes.rbについて
Railsにおいてルーティングの設定をするファイルになります。「rails g controller モデル名」というコントローラーの自動生成コマンドを実行したら自動的にルーティングの設定をこのファイルに書き込んでくれます。
ただ、rails g controllerで生成される自動設定は最低限まずアプリとして動く状態の設定に過ぎず、適切なアプリケーション設定は開発者自身が行う必要があります。しっかりと書き方を理解して実装できるようになりましょう。
config/routes.rbを構造化するための記述方法
scope
オプションを色々指定することでブロック内の定義に一定の制約をかけます。通常の利用であればコントローラのフォルダ構成を変えずにURLを変更することができます。
例
1 2 3 |
scope :admin do resources :tasks end |
生成されるルーティング
1 |
GETで「/admin/tasks/new」に「tasks#new」 |
scopeのオプション
:pathオプション
URL階層
:moduleオプション
モジュール、詳しくは下記の段落で解説しています。
:asオプション
URLパータン名のプリフィックス
scopeのmoduleオプションについて
moduleを使うことでURLを変えずにコントローラーのフォルダ構成を変更することが可能です。
例
下記例では「controller/admin/TaskController.rb」というフォルダ分けになる。
1 2 3 |
scope module: :admin do resources :tasks end |
生成されるルーティング
URLとしては通常のルーティングと何ら変わりません。
1 |
GETで「/tasks/new」に「tasks#new」 |
namespace
URL階層、モジュール、URLパターン名のプリフィックスにまとめて制約をかけます。つまりscopeと比較してコントローラのフォルダ構成を変えつつ、URLを変更することが可能です。scopeと違いどこかのオプションだけ制約をかけるということはできません。
例
1 2 3 4 |
namespace :admin do root ‘tasks#index’ get ‘about’, to: ‘tasks#show’ end |
生成されるルーティング
1 2 |
「/admin」が「ルートURL」 「/admin/about」が「tasksコントローラ」の「showアクション」を指す。 |
controller
コントローラを指定します。
config/routes.rbをうまく整理するコツ
アプリの機能が増えてくるとroutes.rbの内容がだんだん見にくくなってきてしまいます。それでも見やすさを保つためにはコントローラ単位で整理すると綺麗に整理することができます。URLがどうなっているかよりは機能単位(コントローラー単位)でどういう構造になっているかがわかる方が直感的にルーティング情報を理解できます。具体的には下記のように整理するようにしましょう。
1 2 3 4 5 6 7 8 |
Rails.application.routes.draw do controller :コントローラA do コントローラAのルーティング情報 end controller :コントローラB do コントローラBのルーティング情報 end end |
config/routes.rbで記述する内容のパターン
get 'users/index'
usersコントローラのindexアクションにGETリクエストをする。アクセスさせるURL(http://○○/users)と呼ぶコントローラが一致している場合はこのように記述すると良いでしょう。上記は省略系であり下記のように書き換えることが可能です。
1 |
get 'users/index', to: 'users#index' |
get 'users' to:パス(users#index等)
root to: パス(users#index等)
アプリの玄関口(http://localhost:3000)に表示されるページを指定する。パスを指定する場合はパスの区切りはスラッシュではなく#になるので注意です。
resources :リソース名(users等)
全てのアクションに関するルーティングを一括で設定してくれる。一発で7つのアクションに対応する7つのルートを定義できます。
:onlyオプション
resourcesの中のアクションの対象を絞ってルーティングを設定する。
:exceptオプション
resourcesの中のアクションの対象を除外してルーティングを設定する。
resourcesのデフォルトのルーティング(7つのアクションが自動で作られる。下記はuserというモデルの場合)
機能 | HTTPメソッド | URLパターン | URLパターン名 | ヘルパーメソッド | アクション |
---|---|---|---|---|---|
一覧 | GET | /users | users | users_path | index |
詳細 | GET | /users/:id | user | users_path | show |
新規登録 | GET | /users/new | new_user | new_user_path | new |
登録 | POST | /users | users | users_path | create |
編集画面 | GET | /users/:id/edit | edit_user | edit_user_path | edit |
更新 | PATCHまたはPUT | /users/:id | user | user_path | update |
削除 | DELETE | /users/:id | user | user_path | destroy |
ちなみに、上記のルーティング設定はREST-APIの基本形にもなります。RESTは下記でも解説しています。
resourcesの入れ子(リレーション関係のあるルーティング)
1 2 3 |
resources :親 do resources :子 end |
そうすると下記のような親子関係のあるルーティングが出来ます。テーブル間でリレーションを貼った場合とかでは選択肢として入るでしょう。
1 2 3 4 5 6 7 8 |
親_子 GET /親/:親_id/子(.:format) 親#index POST /親/:親_id/子(.:format) 親#create new_親_子 GET /親/:親_id/子/new(.:format) 親#new edit_親_子 GET /親/:親_id/子/:id/edit(.:format) 親#edit 親_子 GET /親/:親_id/子/:id(.:format) 親#show PATCH /親/:親_id/子/:id(.:format) 親#update PUT /親/:親_id/子/:id(.:format) 親#update DELETE /親/:親_id/子/:id(.:format) 親#destroy |
match
複数のメソッドを同じURLに紐づけることが可能です。
例
1 2 |
match ‘/about’, to: ‘task#index’,via: [:get,:post] match ‘/about’, to: ‘task#index’,via: :all(全てのアクションに紐付ける、正直あまり使う機会はない) |
REST以外の独自のアクションをルーティングで使いたい場合はcollection(集合)とmember(個別)を利用する必要があります。
collection
idなしのURLに対してルーティング情報を追加でいきます。(自動で追加される7つのルーティング情報以外に追加します。)
通常の例
記述方法
1 2 3 4 5 6 7 |
resources :admin do #全データを対象とする場合(つまり「:id」をURLにつけない。) collection do post: search1 post: search2 end end |
生成されるルーティング
1 2 |
POSTで「/admin/search1」に「admin#search1」 POSTで「/admin/search2」に「admin#search2」 |
collectionの簡易表記例
collectionを使わずに記述すると下記のようになります。
1 2 3 |
resoucers : users do post :another, action: :another_new,on : :new end |
on: :追加したいアクション
ルーティングURLを追加したいアクションを追加します。
下記のようなルーティングが生成されています。newの下階層に追加されています。
1 |
another_new_user POST /users/new/another(.:format) users#another_new |
member
特定のデータ(:id)に対してURLを生成したい場合に使います。
例
1 2 3 4 5 6 7 |
resources :admin do #特定のデータを対象とする場合(つまり「:id」をURLにつける。) member do get: getdata1 get: getdata2 end end |
生成されるルーティング
1 2 |
GETで「/admin/1(任意)/search1」に「admin#getdata1」 GETで「/admin/1(任意)/search2」に「admin#getdata2」 |
この記事へのコメントはありません。