世界が幸せで在ります様に

ITエンジニアになりたい人・エンジニアの人にとって役立ちそうな商品を紹介するブログ

【初心者・入門者】Ruby on Railsの『routes ルーティング』(member, collection, :onオプション)を復習しよう!

f:id:sinsinchang:20180705122735j:plain

こんちは.最近暑いよね.

学生の頃,数学の家庭教師4年間やってたからかもしれないけど,人に教えるのが好きなんだ.

だから,最近プログラミングの講師とかやろうと思ってるZE!

だから今日もRailsの復習記事書いてみたよ.

 

今日は,Ruby on Railsroutes.rbにさらなるルールを解説するよ.

けっこう詰まりやすいのが,memberとcollectionだよね.書き方が1種類でないてところがまたややこしいってね.

こういうパターンもたくさん見かけるからわかりにくくなっちゃうと思う.

前回はresourcesの動きを書いたけど,こっちは大丈夫かな??もし忘れてる人いたら目を通しておいてね.

valuable.hatenablog.com

 

 

みんなは,新しくプロジェクトに入ってみたり,他の人のコードとかみてて,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!

なんとなく紹介するよ.でも,僕の記事を読むほうが価値があると思うんだ.

それにこのブログを読むのはタダだからね.

 

かんたん Ruby (プログラミングの教科書)

かんたん Ruby (プログラミングの教科書)

 

 

たのしいRuby 第5版

たのしいRuby 第5版

 

 

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

[改訂2版]Ruby技術者認定試験合格教本(Silver/Gold対応) Ruby公式資格教科書

  • 作者: 牧俊男,小川伸一郎,前田修吾,CTCテクノロジー株式会社
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/08/25
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る
 

 

改訂2版 パーフェクトRuby

改訂2版 パーフェクトRuby

 

 

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

 

次回

次は,多重resourcesとそれにまつわるオプションonlyとexceptについて解説するよ.

これもわかりにくいよね.

でも,わかりやすく書くから,是非読んでね.