LoginSignup
24
14

More than 5 years have passed since last update.

ルーティングの役割と機能

Last updated at Posted at 2017-11-12

ルーティングについての理解がまだ浅く、どのような記述をしたらどのように動くのか?というのがいまいちわからなかったのでまとめてみました。

環境

  • IDE:Cloud9
  • Ruby:ruby 2.0.0p648
  • Rails:Rails 4.0.5

Railsのルーティング

Railsのルーターは受け取ったURLを認識し、適切なコントローラ内アクションに割り当てます。ルーターは、ビューでこれらのパスやURLを直接ハードコードすることを避けるためにパスやURLを生成することもできます。
RailsGuides:https://railsguides.jp/routing.html

ユーザーがwebページへのアクセスを要求するというのは、サーバーへリクエストを送るということです。その送られてきたリクエストに対して、ルーティングで適切なコントローラーへ割り当てていくというのが、ルーティングの機能になります。

記述方法

rootを指定

routes.rb
root "static_pages/home"

rootメソッドを使用することによって、ルート'/'が指定できます。というのも、URLがhttp://localhost:3000であった場合、そこにアクセスしてもページは表示されません。しかし、rootでコントローラーとアクションを指定することによって、その指定されたページを表示できるようになります。

getで指定

routes.rb
get "static_pages/home"

上記で指定した場合、このコードは/static_pages/homeへのアクセスは、StaticPagesコントローラーのhomeアクションを処理する。という意味になります。ルーティングでは_(アンダーバー)が入っているにも関わらず、コントローラーの名前にはないのはなぜか?という疑問を持たれた方はこちらのページを参照ください。 参考:コントローラの作成と命名規則(命名規約)
コードを文字で示すなら、get コントローラー名/アクション名ということになります。ちなみに、StaticPagesコントローラーの中身は以下のようになります。

StaticPagesController
class StaticPagesController < ApplicationController
  def home
  end
end

matchで指定

routes.rb
match '/about',  to: 'static_pages#about',  via: 'get'

このコードは、aboutというパスが指定された場合は、StaticPagesコントローラのaboutアクションを処理する。ただし、getの場合のみ。という意味になります。
パスというのはURLのhttp://localhost:3000/パスの部分です。URL+static_pages/aboutと記述していたのが、URL+/aboutで済むようになります。
getというのは、HTTPメソッドのことです。HTTPメソッドは以下の記事を参考にしてください。
HTTPメソッド(CRUD)についてまとめた
また、matchを使用すると名前付きルートも自動で生成されるので、viewでの使い勝手がよくなります。
コードを文字で示すと、match 'パス', to: 'コントローラー名#アクション名', via:'HTTPメソッド'となり、名前付きルートのパス_pathが自動的に使用できるようになります。

resourcesで指定

routes.rb
resources :photos

このコードだけで以下の7つのルーティングが作成されます。

HTTP動詞 パス コントローラ#アクション 目的
GET /photos photos#index すべての写真の一覧を表示
GET /photos/new photos#new 写真を1つ作成するためのHTMLフォームを返す
POST /photos photos#create 写真を1つ作成する
GET /photos/:id photos#show 特定の写真を表示する
GET /photos/:id/edit photos#edit 写真編集用のHTMLフォームを1つ返す
PATCH/PUT /photos/:id photos#update 特定の写真を更新する
DELETE /photos/:id photos#destroy 特定の写真を削除する

Railsガイドより引用

resourcesという一文のみで7つのルーティングが使用できるようになるわけですが、7つすべての機能はいらない場合があります。その場合は、以下のように記述することによって機能を制限することができます。

routes.rb
resources :photos,      only: [:new, :create, :index]

ネスト(入れ子)して指定

先ほどのphotosにコメントを入れる場合、写真に対してコメントが紐づきます。つまり、写真1枚に対するすべてのコメントのURLは/photos/写真のid/commentのようになると予想されます。このように、お互いが紐づけされるような場合はdoを使用してあげます。

routes.rb
resources :photos do
  resources :comment
end

このようにすることで、photosに関連付けされたcommentを指定できるようになります。

まとめ

  • rootで最初のページを指定できる。
  • get コントローラー名/アクション名で指定できる。
  • match 'パス', to: 'コントローラー名#アクション名', via:'HTTPメソッド'だとHTTPメソッドの指定ができ、自動的に名前付きルートが使用できる。
  • resourcesで指定するとindex,new,create,show,edit,update,destroyがアクションが使用できるようになる。
  • resourcesにonlyを指定すると、指定したアクションのみに制限することができる。
  • do~endを使用するとURLを入れ子にした形にすることができる。

 参考

RailsGuides:https://railsguides.jp/routing.html
RubyLife:https://www.rubylife.jp/
https://qiita.com/Ryutaro/items/a9e8d18467fe3e04068e

24
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
14