さて、これがシナリオの例です。学生用リソースがあり、resources :students
学生は多くのコレクションを持っており、それらに属しています:resources :clubs
、resources :majors
など。
したがって、ルートを簡単に設定できます...
resources :clubs do
resources :students
end
resources :majors do
resources :students
end
resources :students do
resources :clubs
resources :majors
end
これにより、一連の標準的なRESTfulルートが生成されます
- / clubs
- / clubs /:id
- / clubs /:club_id / students
- / clubs /:club_id / student /:id
- /専攻
- / majors /:id
- / majors /:major_id / student
- / majors /:major_id / student /:id
- /学生
- / student /:id
- / student /:student_id / clubs
- / student /:student_id / clubs /:id
- / student /:student_id / majors
- / student /:student_id / majors /:id
これが私の質問です。RESTセマンティクスでは、学生の専攻をどのように削除しますか?専攻の下で学生を閲覧する/majors/:major_id/students/:id
と、特定の専攻の「コレクション」にその学生が表示されます。ただし、:idを削除するためのルートは、を指しStudentsController#destroy
ます。これにより、学生は完全に削除されます。おっと!ですから、逆に行って、リソースに対してDELETEを実行すると、/students/:student_id/majors/:id
UnderwaterBasketweavingはこの学校では提供されなくなります...おっと!
これで、ClubsController、MajorsController、StudentsControllerのdestroyメソッドを設定して、club_id、major_id、student_idを検索できますが、将来的には、FraternitiesやGraduatingClassesなどを追加したいとします。各クラスは次のようになります。どのパラメータが存在するかを確認するための巨大なスイッチ条件で構成されています...次に、最上位のリソースのコレクションを見つけて最下位のリソースを削除するか、またはその逆を行います。モデル自体は、関連付けレコードがなくなった場合に自分自身を削除するかどうかを決定する必要があります...そのリソースの「破棄」は実際には誤った名称になっています...
これを行う簡単な方法はありますか?人気のあるRESTfulRailsプラグインでさえ、Joe's Majorsから削除するときにUnderwaterBasketweavingを吹き飛ばしたり、主要なUnderwaterBasketweavingから削除するときにJohnDoeを完全に削除したりしますmake_resourceful
。resource_controller
セマンティクスの望ましい効果と「破棄」が何をすべきかを理解するために、関連付けを調べる可能性があるように思われます。
それではまた、私はこれをすべて間違って見ていますか?単一のリソースとしてのUnderwaterBasketweaving->JoeではなくUnderwaterBasketweaving+Joeであり、削除するのは本当にJoeでもUnderwaterBasketweavingでもありませんが、組み合わせを表すリソースですか?ただし、コントローラーが学生と専攻である場合、それは事実上同じ名前のリソースを表すので簡単ではありません(MVCは実際にはRVになりました...「従来の」アプローチでは、モデル名に関係のないコントローラーを開発していません、またはそれに到達するためのパス)したがって、専攻または学生を削除することになります。あなたの毒を選んでください...
削除がコレクションのコンテキストにあり、その特異性に関係しないことが望まれる場合、削除が実際には意図されていない、関連するリソースの無限のグラフ全体で条件を管理することを回避するにはどうすればよいですか?
... major.student.delete
...'学生'ActiveRecordオブジェクトが'メジャー'ARオブジェクトで始まるメソッドチェーンで'削除'メッセージが送信されたことを知る方法はありますか?