質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

2393閲覧

railsのルーティングの階層構造について

zackieeee

総合スコア16

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

2グッド

0クリップ

投稿2019/07/19 12:57

最近勉強を初めて自分でWebアプリケーションを作ろうと手をつけ始めました。
初学者のため、基礎が分かっておらず、ネットで探しても中々思うような記事が見つからず、ご教示いただけると嬉しいです。

◾️知りたいこと
railsのRoutes.rbファイルにおいて、ネストをさせる場合の基本的な考え方。

◾️事例
なんちゃってブログ(Webアプリケーション)を作ろうと思ったとします。
想定されるモデルは以下の通り。

【モデル】
①Userモデル(ユーザ)
②Blogモデル(ユーザのマイページ)
③Postモデル(投稿)
④Commentモデル(投稿に対するコメント)

 それぞれ以下のようなアソシエーション。
【アソシエーション】
①(has_one) -②(belongs_to)
①(has_many)-③(belongs_to)
①(has_many)-④(belongs_to)
②(has_many)-③(belongs_to)
③(has_many)-④(belongs_to)

 何となく短絡的に、こんなルーティングネストを書きたくなります。

routes.rb(例)

1 2 resources :users do 3   resources :blogs do 4 resources :posts do 5 resources :comment 6 end 7 end 8 end 9

 commentのshowをしようと思ったら、パスは・・・ user/1/blog/1/post/10/comment/1・・・・??

 ただ、パスを考えるとネストする度にどんどん深くなっていき直感的とは言い難いです。
実際に私が読んだ記事などでもネストは1、2つまでと書かれていることが多いです。

 ユーザの配下に直接postsも配置させる?
けど、commentsも入れると結局3階層????ムムム??
form_forとか一体どこに飛んでいくだ???と混乱してしまいました。

◾️教えて欲しいこと
モデルのアソシエーション自体は必要だと思うため、問題ないと思っています。
ただ、これらを表す時のRoutes.rbファイルのネストのさせかたの基本が分からず、
通常どうやって浅くしているものか、参考となるページなどがあれば、ご教示いただきたいなと考えております。

初学者で基本中の基本すぎて大変恐縮ではありますが、何かアドバイスをいただければ嬉しいです。
拙い文章ばかりで申し訳ありませんが、よろしくお願いいたします。

marigold_24, kurimaru👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

すみません、解決済みになっていますが回答させていただきます。

resourcesをネストさせることはまぁまぁの頻度であります。
特に親子関係をもつテーブルがあり、それぞれ親に紐づくデータのみを扱いたいときなどです。

ただURLが長くなってしまうというのはよくある悩みで、そういった場合
:user_id/:blog_id/:post_id/coments/:idのような形にカスタマイズすることはあります。
よく見るのはIDではなくユーザー名とかですかね。Qiitaなども
ユーザー名/items/識別IDのような形ですし。

ただ、やはりその親を示す情報を送ってやらないと親を判別できないので
/blogs,/commentsのようなパスでは
特定のユーザーのブログや特定の記事のコメントのみを扱うようなことができません。

そういったスコープを絞ったレコードの操作が不要なのであれば話は別ですが...。

URLの見た目に関してはshallow nestという方法があるそうです。
見た目についてはこの方法を用いればスッキリしそうです。

投稿2019/07/24 04:22

編集2019/07/24 04:41
Mugheart

総合スコア2342

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mugheart

2019/07/24 04:34 編集

おー知らなかったです。ありがとうございます。 でもやっぱりネストはしないといけないのは変わらずですね。 URLの見た目の問題は解決できそうです。
zackieeee

2019/07/24 05:49

ありがとうございます! なるほど、ネストさせることでController以降の処理を軽減させる効果もあると理解しました! shallowは、ガイドで読んでいたのですが今一ピンと来ていませんでした。 例えば、質問構成のネストで、commentをnewとeditした場合、以下のようにID不要なものについてURLをスッキリさせてくれる効果がある!と理解しました!  ・new(id不要) → /user/blog/post/comment/new  ・edit(id必要) → /user/1/blog/1/post/1/comment/1/edit 閉じておきながら、更に質問で申し訳なのですが…  ①ネストさせたモデルのINDEX   →ネストさせてしまった場合、親を指定せずに全てを表示させることは出来なくなるのでしょうか?  ②識別IDについて   →ちょっと主題とずれてしまうのですが、    例えばhas_oneの関係にあるものについて、    cookpadなどを見ていると、識別IDをユーザID(?)で統一しているように見受けられます。    IDを特定のIDで統一すると言うことも可能なのでしょうか??? すみません、トンチンカンな事を言っている可能性もあり、大変恐縮ですが…よろしくお願いしますmm
Mugheart

2019/07/24 06:03 編集

① そんなことはありません、できます ② 可能です。 というより全て親レコードのid(?)を使っているだけのことでしょう。 kitchen/親レコードid => 親レコードに紐づくkitchenページ recipe/list/親レコードid => 親レコードに紐づくrecipe一覧 みたいな感じですかね。 「親に紐づく子レコード群のみを表示するときは親レコードの情報が必要」とはこういうことです。
zackieeee

2019/07/25 04:24

①ありがとうございます!承知しました! ②心強いです!  初学者のため、今一ピンときていないのですが、  例えばuser/1(user_id)/blog/3(blog_id)などのルーティングは、newないしcreateされた時のタイミングで一意に決まるプライマリキーが自動割り当てされると言う感覚です。  そのためuser_id = blog_idになっていないと、namespaceやshallowしたとしても、  blog/3(blog_id) (≠ user_id)となりそうですが、id自体を親ネストのIDにも 出来るんですね!(?▼?)! 話が逸れすぎてるので、こちらはもう少し自力でも学習してみようと思います><  すみません、色々とご教示いただきありがとうございます!
guest

0

ベストアンサー

Modelの階層に合わせて controller、URL、routes を階層化する必要はありません。管理者とユーザで違うことをしたいとか、複数のsub-systemを分けて管理したいというような目的で
namespace :admin
resources :blogs
というような階層化はよくやりますが。

Userにアクセスするには /users
そのblogにアクセスするには /blogs
で良いと思うのですがどうでしょう。

投稿2019/07/19 13:16

winterboum

総合スコア23324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zackieeee

2019/07/21 01:07

ありがとうございました! 頂いた内容からするとresourcesをネストさせるのは、通常あまりやらないこと、と理解しました。 合わせて、いくつか新たな疑問点ご教示いただけると幸いです。 ・resourcesをネストさせるメリットってなんなんでしょう…  →論理的な階層構造が気持ち分かりやすくなるぐらいなんでしょうか?   ただ、ネストしすぎると結局余計に分かりにくくなるため、下手に実装するのは辞めた方がいい… ・回答にあるSub-Systemを別けるとはどう言うイメージなのでしょうか??  →Controllerを分割したけど、ネストさせずにカテゴリ的には一緒だよ!って表記したいとかでしょうか… 初心者で本当に申し訳ありません。 よろしくお願いいたします。
winterboum

2019/07/21 11:45

・resourcesをネストさせるメリットってなんなんでしょう…  namespaceでなく、ですか? それですとわかりません。 ・回答にあるSub-Systemを分ける あまり良い例ではないですが、私のサイトでは MSDN Top 線形計画法 複式簿記 太陽光発電 勤務割付 ユーザメンテ オプション 気象 予報 ヘルプメンテ HowTo 倉庫管理 という無関係のものが寄せ集めてあるので、一緒くたでは収集つかなくなるので、分けています。 よく有るかも、なのは マスター、受注、発送、請求・入金、経理 みたいなので分ける
zackieeee

2019/07/24 01:51

回答が遅くなってしまい、すみません!! resourcesをネストさせるより、namespaceを使用する方が一般的と理解しました。 これは階層構造自体に機能的な意味を持たせるとメンテナンス性が低下するリスクが生じるからと言う解釈です。 また、サブシステムについても、どう分けるかはシステム設計やシステムの性格によるって感じですね。 例にあげて頂いたサイトでは、各業務(?)ごとに同じ処理の流れを持っているので、その流れごとにnamespaceを作って流って感じでしょうか? それともマスターに所属するものは、ヘルプ、メンテナンス、HowTo。発送は倉庫管理…とかって感じかな。。。 今回私が作ろうとしているアプリもnamespaceをつけて、論理的にカテゴライズしてみようと思います。 ありがとうございます!
winterboum

2019/07/24 03:52

もうひとつnamespaceを使う典型的なのがありました。 管理者としての業務と一般ユーザとしての業務を分けるためにnamespaceで切り分けることを良くやります
zackieeee

2019/07/24 05:59

ありがとうございます! 管理者と一般ユーザを分けるための例は、ご教示いただいた後探してみた結果、たくさん出てきました! この切り分け是非取り入れたいと思います!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問