好的,这是一个示例场景。有一个学生资源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/:club_id/学生
- /clubs/:club_id/students/:id
- /专业
- /专业/:id
- /majors/:major_id/学生
- /majors/:major_id/students/:id
- /学生
- /学生/:身份证
- /students/:student_id/clubs
- /students/:student_id/clubs/:id
- /students/:student_id/专业
- /students/: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 等。每个类都将开始由巨大的开关条件组成,以查看存在什么参数...然后找到顶部资源的集合并删除底部资源,反之亦然。如果模型没有更多的关联记录,他们自己应该决定是否删除自己......对该资源的“销毁”已经成为一个用词不当......
有没有更简单的方法来做到这一点?甚至流行的 restful rails 插件也喜欢make_resourceful
或resource_controller
会在从 Joe's Majors 中删除 UnderwaterBasketweaving 时将其吹走,或者在将 JohnDoe 从主要的 UnderwaterBasketweaving 中删除时完全删除他。似乎有可能查看关联以了解语义的预期效果以及“破坏”应该做什么。
再说一次,我看这一切都错了吗?不是 UnderwaterBasketweaving -> Joe 而是 UnderwaterBasketweaving+Joe 作为单一资源,我们要删除的确实不是 Joe,也不是 UnderwaterBasketweaving,而是代表组合的资源?但是,当控制器是 Student 和 Majors 时,这并不容易,这实际上代表了同名的资源(MVC 已经真正成为 RV ......在“约定”方法中,而不是开发可能与模型名称无关的控制器,或到达它的路径)因此您将删除专业或学生;选择你的毒药...
我如何避免在关联资源的无限图上管理条件,当删除确实不是意图时,删除是在集合的上下文中而不是与它的奇点有关...?
... major.student.delete
... 有没有办法让“学生”ActiveRecord 对象知道它在以“主要”AR 对象开头的方法链中发送了“删除”消息?