よちよち.rbでrake routes で出てくる結果について学びました
毎週月曜日、よちよち.rbにて、Rails4のお勉強をしております。
(今はRailsチュートリアルをやってます)
※よちよち.rbについて詳しくは
http://yucato.net/about-yochiyochirb
第11回、第12回のよちよちでrake routesあたりのことを学び、色々勉強になりましたので、その内容を纏めたいと思います。
使った教材
Railsチュートリアルの2.2.2 MVCの挙動
第2章 デモアプリケーション | Rails チュートリアル
学んだこと
リクエストされたURLをさばくのはconfig/routes.rbで書かれた内容に基づく
Railsチュートリアルの図2.11で「Rails router」として描かれている部分。
config/routes.rbの中にresources :users
などと書かれている部分があり、
そこの記載で色々決まるみたいです。routes.rbの中身「resources :users」の意味
resourcesというのはメソッドで、(resources - リファレンス - - Railsドキュメント)
indexとかcreateとか幾つか(よく使う?)アクションへのルーティングを
まとめて定義してくれる便利なもの。
引数の:usersはuserに対する諸々を定義してくださいね、というお願いを(私が)している部分どういう定義がされているのか確認する方法
コマンドラインでrake routes
すると
Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index POST /users(.:format) users#create new_user GET /users/new(.:format) users#new edit_user GET /users/:id/edit(.:format) users#edit user GET /users/:id(.:format) users#show PATCH /users/:id(.:format) users#update PUT /users/:id(.:format) users#update DELETE /users/:id(.:format) users#destroy
みたいな感じで定義を見ることが出来ました。
ここに、ブラウザからどんなリクエストがきたら、どんなアクションを(Rails routerがコントローラーに)お願いするのかが書かれているようです。
rake routesの中身について
resourcesの引数を:usersにしたので、URIとControllerはusersのことになっているのでしょう。
あとはGETとかPOSTとかのhttpのメソッドとURIのパターンで呼び出すアクションが決まるみたいです。
resourcesと書いただけなのに、index〜destroyまで一気に定義されることに感動。resources :usersをもう少し掘り下げてみる
一気に定義される便利さに感動する一方で、定義しないお願いも出来るみたいです。
よちよちで、きたむー先生に教えて頂きました。オプションがあるみたいです。
resources - リファレンス - - Railsドキュメントを見ると
resources :users, :only => [:index]
みたいな感じですかね。
routes.rbを編集した後、rake routes
で
Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index
となりました。
この作業を通じて、routes.rbを編集するとビルド的な作業とかすることなく、すぐにrake routesに反映されるのだ、ということも同時に学びました。
- routes.rbをもうちょっと試してみる
書けばすぐに反映されると分かり、失敗してもgitで戻せば良いね、ということもあり
:usersじゃないのを書くとどうなるのだろうか、と。
適当にresources :foo
とか書いてrake routes
Prefix Verb URI Pattern Controller#Action foo_index GET /foo(.:format) foo#index POST /foo(.:format) foo#create new_foo GET /foo/new(.:format) foo#new edit_foo GET /foo/:id/edit(.:format) foo#edit foo GET /foo/:id(.:format) foo#show PATCH /foo/:id(.:format) foo#update PUT /foo/:id(.:format) foo#update DELETE /foo/:id(.:format) foo#destroy
定義されますね。
Controllerは作ってないので、呼び出す先はないのですが、Rails routerは粛々と仕事をするのだということが分かりました。
ちなみに、ゆかおさんからusersみたいに複数形じゃない場合にはfoo_index
みたいにちょっと定義が変化する、と教えて頂きました。
感想
昔、自分でこの辺りの話勉強したときに比べて、よく分かった感が半端なかったです。
(もちろん、まだまだ分からないことだらけですが)
目線の高さが同じぐらいの人たちと学習する楽しさを日々実感してます。