2012-05-11 10 views
1

リソースをネストするかどうかを判断する基準は何ですか?Railsでネストされたリソースを選択するベストプラクティス?

以前は、関連するリソース(親)にスコープを設定することなく、リソースに対するインデックスアクションが意味を持たない場合にネストすることを選択しました。

上記の基準を書いていても、私はそれが最高であいまいであることを認識しています。それは視覚的にURL構造における関連するモデルの関係を捉えるため

ネストリソースを...そして、それはそれは簡単にだけポストに戻って取得するためのURLを変更することができます:

同僚は述べています。私が/ posts/123/offers/555を見ると、私は/ posts/123に行き、自分の投稿を見ることができることを知っています。まるでちょうど私が/見出し/ 555を見たかのように、手動でサイト内を移動する以外の方法で投稿に戻ることはできません。私に

、ユーザーによるURLの操作は、アプリケーションのアーキテクチャには何の関係を持っていない、と私はネストされたリソースはすべての可能であれば避けるべきであることが一般的に開催された原則であることを理解して何に対して飛ぶ必要があります。さらに、この議論は複数レベルのネスティングをサポートしていると思われます。

あなたの経験は何ですか?

答えて

0

ルートを入れておくと、ルートの中の後のものが元のルートなしで意味をなさないときに最初に置くようになります。ブログのコメントは、resources articlesにネストされます。なぜなら、個人的なページを自分のページ(理由を知っている人)に表示したいのですが、コメントは記事に属しているからです。

これにはコントローラーの実装も含まれています。記事を知っている場合は、その記事にスコープされている特定のコメントを見つけることができます。これにより、より効果的なクエリが作成されます。

また、あなたの同僚は、間違った理由があったにもかかわらず、あなたのルートをめちゃくちゃにしているユーザーに対処しなければならないということは間違いありませんでした。彼らの便宜のためではなく、彼らの安全のためです。

ユーザーとオーダーがあるAmazonのようなアプリを紹介しましょう。私がusers/5/orders/2にいる場合、私は "ちょっと、私はちょうどその5を4に変更してから、他の人の命令を見ることができます"と思う。オーダーをスコープしないと、ユーザーにorders/2を表示する権限を与えるコントローラー・レベルのロジックがはるかに複雑になります。ユーザにスコープを設定すると、オーダーコントローラのcurrent_user.orders.find(params[:id])が許可されます。現在のユーザーは認証に基づいて見つけることができるので、URL内のIDを交換して他のユーザーになることはできません。

+1

あなたのAmazonのような例は、ネストされたルートの価値を実際に示していません。 current_user.ordersを実行している場合、users/5/orders/2の "users/5"は完全に余分です。だから私はそれがセキュリティの例であるかどうか本当に分かりません。/orders/2はまったく同じことをしている可能性があります:current_user.orders.find(params [:id])...だから、私はそれほどのポイントを得ていません。私はこれがネスティング・ルートが適切でない例であると感じるのがより簡単です。なぜなら、それは全く価値がないからです。 – patrick

関連する問題