Restfully détruire association polymorphique dans Rails?
-
19-09-2019 - |
Question
Comment puis-je détruire l'association elle-même et laisser les objets étant seuls associés, tout en gardant cette RESTful?
Plus précisément, j'ai ces modèles:
class Event < ActiveRecord::Base
has_many :model_surveys, :as => :surveyable, :dependent => :destroy, :include => :survey
has_many :surveys, :through => :model_surveys
end
class ModelSurvey < ActiveRecord::Base
belongs_to :survey
belongs_to :surveyable, :polymorphic => true
end
class Survey < ActiveRecord::Base
has_many :model_surveys
end
Cela dit que l'événement est :surveyable
(ModelSurvey belongs_to Event
). Ma question est, sans avoir à créer un ModelSurveysController
, comment puis-je détruirai le ModelSurvey
, tout en laissant le Event
et Survey
seul?
Quelque chose avec map.resources :events, :has_many => :model_surveys
? Je ne suis pas tout à fait sûr de ce qu'il faut faire dans cette situation. Ce qui doit se produire avec les routes, et ce qui doit arriver dans le contrôleur? J'espère que l'URL pourrait ressembler à ceci:
/events/:title/model_surveys/:id
Merci pour votre aide, Lance
La solution
Dans Rails 2.3, vous avez accepts_nested_attributes_for
qui vous laisser passer un tableau de ModelSurveys à l'événement en question. Si vous permettez à détruire par la déclaration d'attributs imbriqués, vous serez en mesure de passer event[model_surveys][1][_destroy]=1
et l'association sera supprimée. Consultez le docs api.
Autres conseils
Domaine Ressources! = Domaine du modèle
Le domaine du contrôleur est pas la même que celle des modèles. Il est parfaitement bien de mettre à jour plusieurs modèles en changeant l'état d'une ressource.
Dans votre cas, cela signifie faire un PUT ou POST soit l'événement ou l'enquête qui contient une liste des ids pour l'autre. Le modèle pour une mettra à jour l'association.
PUT ou POST
Certaines personnes (mais pas Roy Fielding ) croient que vous devez utiliser une mise à jour de la ressource et fournir tous l'état nouveau, d'autres estiment qu'un POST avec l'état partiel (ala PATCH) suffit.