概要
GETやPOSTなどのリクエストがあったときconfig/routes.rbの内容に従って各コードにルーティングされる。
このルーティングファイルの書き方を整理する。
前提
以下のような構成のアプリケーションを考える。
- コントローラー:pages_controller.rb
- アクション:top
- ビュー:top.html.erb
- コントローラー:users
- アクション:sign_up、sign_in
- ビュー:sign_up.html.erb、sign_in.html.erb
デフォルトのroutes.rb
設定と動作
ルーティングファイルはconfig/routes.rbにある。コントローラー生成直後のファイルの内容は以下のとおり。
1 2 3 4 5 6 7 8 9 |
Rails.application.routes.draw do get 'users/sign_in' get 'users/sign_up' get 'pages/top' # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end |
初期状態では、GETメソッドで各ビューファイルがリクエストされたとき、ディレクトリー構成に従ってファイルを探すようルーティングされる。
たとえばブラウザーでhttp://localhost:3000/pages/topと入力するとpages
ディレクトリー下のtop.html.erb
が表示される。
このページに他のページからヘルパーでリンクを張る場合は以下の様に書く。
<%= link_to 'トップ', '/pages/top %>
ルーティング
ルーティングの設定状態はrails routes
コマンドで確認できる。
1 2 3 4 5 |
[vagrant@vagrant ex_bbs]$ rails routes Prefix Verb URI Pattern Controller#Action users_sign_in GET /users/sign_in(.:format) users#sign_in users_sign_up GET /users/sign_up(.:format) users#sign_up pages_top GET /pages/top(.:format) pages#top |
Prefixの列はリンクのエイリアスに関する表示で、ヘルパー中でプレフィックスに'_path'
を付けた名前でリンク先を表せる。
たとえばtop.html.erb中に以下の行を追加するとリンクが表示され、クリックするとsign_in.html.erbページに遷移する。
<%= link_to('サインイン', users_sign_in_path) %>
まとめ
- ルーティング設定で各アクションを呼ぶためのURLを設定できる
- URLでルーティングする場合は文字列とする
Prefix
と_path
を組み合わせたエイリアスでもルーティングができ、その場合はコロンなしで書く
ルーティングの設定変更
設定と動作
コントローラー生成時のルーティングを変更して、それぞれのページがアプリケーションルートから直接呼び出せるようにする(たとえばlocalhost:3000/topなど)。
1 2 3 4 5 6 7 |
Rails.application.routes.draw do get '/top', to: 'pages#top' get '/sign_up', to: 'users#sign_up' get '/sign_in', to: 'users#sign_in' end |
3つのルーティングとも同じ方法で指定している。
メソッド 'URL', to: 'コントローラー#アクション'
これでそれぞれのURL指定’/top’などに簡略化され、GETリクエストに対して対応するアクションが実行される。
この場合、トップページに以下のようなURL指定のリンクを追加すると、クリック時にサインインページに遷移する。
<%= link_to('サインイン', '/sign_in') %>
ルーティング
ルーティングの一覧は以下のとおりで、Prefixの列も簡略化されている。
1 2 3 4 5 |
[vagrant@vagrant ex_bbs]$ rails routes Prefix Verb URI Pattern Controller#Action top GET /top(.:format) pages#top sign_up GET /sign_up(.:format) users#sign_up sign_in GET /sign_in(.:format) users#sign_in |
Prefixも変更されているので、top.html.erb中に以下の行を追加するとリンクが表示され、クリックするとsign_in.html.erbページに遷移する。
<%= link_to('サインイン', sign_in_path) %>¥
まとめ
- ルーティングの
, to: 'controller#action'
によって、設定したURLから指定したアクションにルーティングできる - カンマ、toキー(
to:
)、'コントローラー#アクション'
の文字列
ルーティングの名前
設定と動作
routes.rbのsign_in
の行に, as:
を追加して以下の様に変更する。
get '/sign_in', to: 'users#sign_in', as: :sign_in_page
この場合、リンク先としてsign_in_page_pathを指定してルーティングできるようになる。
ルーティング
このときのルーティングは以下の様になっている。
1 2 3 4 5 |
[vagrant@vagrant ex_bbs]$ rails routes Prefix Verb URI Pattern Controller#Action top GET /top(.:format) pages#top sign_up GET /sign_up(.:format) users#sign_up sign_in_page GET /sign_in(.:format) users#sign_in |
この場合、linkt_to
から呼び出す名前はsign_in_page_path
になり、従前のsign_in_path
を使うとエラーになる。
つまり、as:
で指定された内容で元のPrefix
がオーバーライドされ、以後はその内容の名前かURLで指定しなければならない。
まとめ
- ルーティングの名前を
', as: :name'
で設定できる - 設定はカンマ、asキー(
as:
)、名前シンボル - 名前を設定すると、
Prefix
がそれに置き換えられる