Rails Restful Delete в вложенных ресурсах
-
29-09-2019 - |
Вопрос
Итак, вот пример сценария. Есть студенческий ресурс 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
который генерирует нам кучу стандартных плотных маршрутов
- /клубы
- /клубы/: id
- /clubs/: club_id/студенты
- /clubs/: club_id/students/: id
- /майоры
- /Majors/: id
- /Majors/: major_id/студенты
- /Majors/: Major_id/Student/: ID
- /ученики
- /студенты/: id
- /Студенты/: Студент_ID/Клубы
- /Студенты/: Student_id/Clubs/: ID
- /Студенты/: Студент_ID/Majors
- /Студенты/: Студент_ID/Majors/: ID
Итак, вот мой вопрос. С семантикой отдыха, как можно удалить специальность для студента? Просмотр студентов под крупным /majors/:major_id/students/:id
покажет, что студент в конкретной коллекции майора. Но маршрут удаления: ID, указывает на StudentsController#destroy
, который полностью удалил бы студента. Упс! Так что, возможно, мы идем в другую сторону и выполняем удаление на ресурсе в /students/:student_id/majors/:id
И теперь в этой школе больше не предлагается подводная панель.
Теперь, предоставленные, мы могли бы установить метод уничтожения ClubScontroller, MajorsController или StudentController для поиска Club_id, или Major_id, или Student_id, но, скажем, мы также в будущем хотим добавить братства и выпускные классы и т. Д. Каждый класс начнет быть Состоит из огромных условий переключателя, которые, чтобы увидеть, что присутствовало Param ..., а затем найдите коллекцию либо верхнего ресурса и удалите нижний ресурс, либо Vise Versa. Сами модели должен Решите, удаляются ли они, если у них больше нет записей об ассоциации ... «Уничтожить» на этом ресурсе, стало действительно неправильным ...
Есть ли более простой способ сделать это? Даже популярные плагины Restful Rails, такие как make_resourceful
или resource_controller
Взорвел бы подводную паутину при удалении его из майоров Джо или полностью удалил Джондо, когда он убрал его из крупного подводного борьбы. Казалось бы, есть потенциал для рассмотрения ассоциации, чтобы понять желаемые последствия семантики и того, что должно делать «уничтожение».
С другой стороны, я все смотрю на это неправильно? Разве это не подводное оборудование -> Джо, а под водой, новичком+Джо как единственный ресурс, и то, что мы удаляем, действительно не Джо, ни под водой, но ресурс, представляющий комбинацию? Тем не менее, это нелегко, когда контроллеры являются студентами и специальностями, которые фактически представляют ресурсы с таким же названием (MVC действительно стал RV ... в подходе «Конвенция» и не разрабатывая контроллеры, которые могут не иметь никакого отношения к модели, или на пути к нему) Таким образом, вы будете удалять майора или студента; выбрать свой яд...
Как я могу избежать управления условными условиями на бесконечном графике связанных ресурсов, где удаление на самом деле не намерение, когда удаление желательно быть в контексте коллекции и не относится к его единственной единомышленности ...?
...major.student.delete
... есть ли способ для «студенческого» объекта Activerecord, чтобы узнать, что он был отправлен «удалить» в цепочке методов, начиная с «главного» объекта AR?
Решение
Ну, стандартный Restful Atoach - это использовать has_many :through
и генерируйте Cotroller для ресурса ассоциации. Ресурсы ассоциации именования всегда сложны, но я попытаюсь для этого примера.
resources :majors do
resources :studies
resources :students
end
resources :students do
resources :studies
resources :majors
end
Модели были бы, конечно:
class Major < ActiverRecord::Base
has_many :studies
has_many :students, :through => :studies
end
и т.д. (комментарий, если вы хотите, чтобы я уточнил)
Тогда для студента вы бы не удалили бы это @student.major
но его @student.studies.where :major => @major
.