箱のプログラミング日記。

えんじにあ奮闘記

prefixでidを複数持たせる方法【ルーティング】

f:id:y_hakoiri:20191102121704j:plain

今まで何となくしか理解できていなかったルーティングですが、

自分でアプリケーションを作るようになるとそういうわけにもいかず。

 

きちんと勉強しまくったところ、深いところまで知ることができたので

きちんと残しておこうと思います。

 

 

固有のアクションを追加する

大抵のアクションはresourcesで生成される7つでまかなえると思いますが、

中には固有のアクションを指定したい場合もあると思います。

 

そんな時に便利なのがmenberとcollection。

resources :products, only: [:index, :show] do
resources :reviews, except: :show
collection do
get 'search'
end
end

resourcesにネストさせる形で書けば、getで指定したアクションに対してルーティングを作成してくれます。

 

menberとcollectionの違いは、:idをつけたいかどうか。

 

www.javadrive.jp

 

ネストさせて:idが複数ある場合のprefixの使い方

 

たとえばproductsにreviewsをネストさせている場合。

reviewsをeditしたりdestroyしようと思ったら、product_idのみならず

reviewsのidも当然パスに含まれてきます

https://i.gyazo.com/0a33518de4196baa036220036dd7fc3a.png

 こんな感じ。

prefixを使う場合、prefix_path()のように引数にインスタンスの情報を持たせますが、

この状態の場合は引数にproduct_idとreviewのid両方を入れなきゃいけないんですね

 

と言ってもそんなに難しいことはなく、冷静に親、子の順で引数を書けば良いだけ。

 

※ちなみに、editやdestroyはproduct_idがなくても直接関係しているreviewsのidだけで良いじゃん、、、!と思ってあえてネストさせずにやったところ、

そうすると正常にeditアクションが動きませんでした。(destroyは動いた)

 

こういう場合は、ちょっとめんどくさいけど

きちんとネストさせた上でidを二つ持たせる方が良いみたいです。

 

※とは言っても、あまりネストさせすぎるのは複雑化するので良くない。

公式リファレンスでもそのような記述があります

 

ネストが何段にも重なりそうになってしまったら、

そもそものDB設計から考え直した方が良いかもしれません。

 

↓参考

techracho.bpsinc.jp