【初心者・入門者】Ruby on Railsの『routes ルーティング』(member, collection, :onオプション)を復習しよう!
こんちは.最近暑いよね.
学生の頃,数学の家庭教師4年間やってたからかもしれないけど,人に教えるのが好きなんだ.
だから,最近プログラミングの講師とかやろうと思ってるZE!
暇だから今日もRailsの復習記事書いてみたよ.
今日は,Ruby on Railsのroutes.rbにさらなるルールを解説するよ.
けっこう詰まりやすいのが,memberとcollectionだよね.書き方が1種類でないてところがまたややこしいってね.
こういうパターンもたくさん見かけるからわかりにくくなっちゃうと思う.
前回はresourcesの動きを書いたけど,こっちは大丈夫かな??もし忘れてる人いたら目を通しておいてね.
みんなは,新しくプロジェクトに入ってみたり,他の人のコードとかみてて,routes.rbスラット読める??
読めるならこの記事は意味ないのでこの先読まないようがいいよ.
でも,すらすら読めないならこの先進んじゃいなYO!
memberとかを教える前にまずは基礎を解説するよ
じゃあ,今回もusersというresourcesパスを作ろうね.
resources :users
このusersってのはサービスにおける,ユーザにまつわるroutesね.
で,次にusersのそれぞれの処理は覚えてるかな??
- ユーザの一覧を表示させる index
- ユーザをテーブルに保存する create
- ユーザを新しく生み出す new
- ユーザを編集する edit
- ユーザをテーブルに更新する update(putとpatchがあるよ.昔はputが使われてたから互換性のためにあるよ)
- ユーザIDによる表示 show
- ユーザIDによる削除 destroy
この仕様に,ユーザのアイコンを保存したい!ってディレクターさんに言われたとするよね??
まず,さっきのresourcesってのは,rubyおなじみのdo〜endで囲うことで新しくパスを作ることができるんだ.正確にはブロック構文だよ.
書いてみようか
# Aパターン resources :users do post 'icon' end
どう??なんかみたことあるでしょこういうの.
これはユーザのアイコンを新しく保存するって意味だよ.
実際のパスはこんな感じになるよ.
Prefix | Verb | URI Pattern | Controller#Action |
user_icon | POST | /users/:user_id/icon(.:format) | users#icon |
user_icon_pathってのをerbとかに設置する感じだよね.
ただ,ここで注意点があるよ.
:user_idってのがあるから,引数でUserモデルが必要だよ.
具体的には,user_icon_path(@user)のように書かないといけないよ.
そしたら,無事にusers_controller.rbのiconメソッドが実行されるよ.
ここまで理解できたら次の話は楽勝だよ.
memberとcollection
まずは,memberから説明するよ
先程の状況でusers_controller.rbではparams[:user_id]ってやればIDを取得できるんだけど,params[:id]ってやりたい時もあるよね??
そういう時は,こうだよ.
# Bパターン resources :users do member do post 'icon' end end
よく,さっきの例とmemberをつけたときが同じっていう人いるけど,厳密には違うからね.
具体的には,こんな感じになってるよ.
Prefix | Verb | URI Pattern | Controller#Action |
icon_user | POST | /users/:id/icon(.:format) | users#icon |
違う部分はURI Patternね.
あともう一つ覚えてほしいのはこれだよ.
# Cパターン resources :users do post 'icon', on: :member end
これ見たことあるよね??
BパターンとCパターンは全く同じだよ.:onオプションはmember do ~ endのブロックを省略することができるんだ.
例えば,memberの中にたくさんパスを追加したい時はブロックで書いてるよね.
resources :users do member do post 'piyo' get 'hoge' patch 'fuga' end end
でも,単体のときは :onオプションが使われてる事が多いよ.
これで,ややこしい部分が解消されたんじゃないかな.
次は,collectionだよ
例えば,ユーザのツイート一覧が別にほしい,って言われたとするよね??
そんな時はcollectionだよ.
書いてみるね.
# Dパターン resources :users do collection do get 'tweets end end
さっきmemberって書いてたとこが,collectionになっているのがわかるかな??
実際はこんな感じだよ.
Prefix | Verb | URI Pattern | Controller#Action |
tweets_users | GET | /users/tweets(.:format) | users#tweets |
tweets_users_pathってerbで書けば,users/tweetsにアクセスするよ.そして,users_controller.rbのtweetsメソッドが実行されるんだ.
memberのときとの違いは,:idがないことだよね.
collectionってプログラミングやってるとなじみ深い単語だけどさ,集合体って意味があるじゃない??だから,〇〇一覧を出したいって時とかには便利だよね.
勘のいいみんななら気づいてると思うけど
# Eパターン resources :users do get 'tweets, on: :collection end
これ,DパターンとEパターンの意味は同じだよ.
まとめ
ここまで読んでくれてありがとう!
今日は,以下のことを学んだんだ.
- collectionは:idが必要ない
- memberは:idが必要ある
- memberもcollectionもつけないのは:user_idが必要ある(resourcesの名前空間がidの前につく)
みんな,routes.rbに書かれているパスが大体理解出来てきたんじゃないかな??
多分,これで15%ぐらいは読めるようになってるはずだYO!
本
なんとなく紹介するよ.でも,僕の記事を読むほうが価値があると思うんだ.
それにこのブログを読むのはタダだからね.
[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書
- 作者: 牧俊男,小川伸一郎,前田修吾,CTCテクノロジー株式会社
- 出版社/メーカー: 技術評論社
- 発売日: 2017/08/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
次回
次は,多重resourcesとそれにまつわるオプションonlyとexceptについて解説するよ.
これもわかりにくいよね.
でも,わかりやすく書くから,是非読んでね.