ルーティングについての理解がまだ浅く、どのような記述をしたらどのように動くのか?というのがいまいちわからなかったのでまとめてみました。
環境
- 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を指定
root "static_pages/home"
rootメソッドを使用することによって、ルート'/'が指定できます。というのも、URLがhttp://localhost:3000であった場合、そこにアクセスしてもページは表示されません。しかし、rootでコントローラーとアクションを指定することによって、その指定されたページを表示できるようになります。
getで指定
get "static_pages/home"
上記で指定した場合、このコードは**/static_pages/homeへのアクセスは、StaticPagesコントローラーのhomeアクションを処理する。**という意味になります。ルーティングでは_(アンダーバー)が入っているにも関わらず、コントローラーの名前にはないのはなぜか?という疑問を持たれた方はこちらのページを参照ください。 参考:コントローラの作成と命名規則(命名規約)
コードを文字で示すなら、get コントローラー名/アクション名
ということになります。ちなみに、StaticPagesコントローラーの中身は以下のようになります。
class StaticPagesController < ApplicationController
def home
end
end
matchで指定
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で指定
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つすべての機能はいらない場合があります。その場合は、以下のように記述することによって機能を制限することができます。
resources :photos, only: [:new, :create, :index]
ネスト(入れ子)して指定
先ほどのphotosにコメントを入れる場合、写真に対してコメントが紐づきます。つまり、写真1枚に対するすべてのコメントのURLは/photos/写真のid/comment
のようになると予想されます。このように、お互いが紐づけされるような場合はdo
を使用してあげます。
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