#ルーティングとは
Railsでは「どのようなURLへどのようなHTTPメソッドでアクセスされたら、どのコントローラーのどのアクションを呼び出したいか」をconfig/routes.rbに定義します。アクセスを受けて、適切なアクションへ案内する仕組みをルーティングと呼びます。
##5つの構成要素
ルーティングは、リクエストをアクションへと誘導する「ルートの」集合と捉えることができます。1つの「ルート」は主に以下表の5つの構成要素から成り立ちます。
要素の名前 | 要素の内容の例 | 説明 |
---|---|---|
HTTPメソッド | GET、POSTなど | サーバーへのリクエストで、情報の送信・受信の方法を表す。 |
URLパターン | /posts /posts/:idなど | URLそのものや、:idのように一部に任意の文字が入るパターンを定義する。 |
URLパターンの名前 | new/post postsなど | 定義したURLパターンごとに一意な名前をつける。この名前をもとに、対応するURL生成のためのヘルパーメソッドが用意される。 |
コントローラ | posts(PostsController)など | 呼び出したいアクションのコントローラークラスを指定する。 |
アクション | indexなど | 呼び出したいアクションを指定する。 |
次の図でこれらの要素がどのように利用されるかを表しました。基本的には①のように、HTTPメソッドとURLからアクションに案内しますが、もう一つの働きとして②のように、URLパターンに名前をつけておいて、その名前をもとにURLを簡単に生成するヘルパーメソッドを作り出します。
##1つのルートの定義
では、実際に例を見てみましょう。homeコントローラーのtopアクションがアプリのトップページの説明を取得するとします。
get '/top', to: 'home#top'
この定義は次のような意味になります。
__GET__メソッドで、'/top'というURLに対してリクエストが来たら、__Home__Controllerの__top__アクションを呼び出す。
また、'/top'というURLを、__top___pathというヘルパーメソッドで生成できるようにする。
###複数のHTTPメソッドを受け付けるルートの定義
HTTメソッドの記述の代わりに、mathと:viaオプションの組み合わせを使うと、複数のHTTPメソッドを受け付ける1つのルートを定義できます。
仮に、home#topをPATCHやPUTでリクエストされた際にも呼び出したい場合は以下のようになります。
match '/login', to: 'home#top', via: [:get, :patch, :put]
##URLヘルパーメソッド以外の取得方法
ヘルパーメソッドでURLを得るには、以下の方法もあります。
- ”/posts”といった文字列を直接記述
- { Controller: :posts, action: :index }といったハッシュの利用
1の方法は、あとでそのアクションに対応するURLを変更する際に修正箇所が多くなること、URLの記述方法や本番サーバの運用設定でバグが起きる可能性があるため避けた方が良いでしょう。
#終わりに
ルーティングの理解はつまずきがちですが、この記事が少しでも参考になれば幸いです。最初は、とにかく実装さえできれば大丈夫でしょう!