Restfully distruggere associazione polimorfica in Rails?
-
19-09-2019 - |
Domanda
Come faccio a distruggere l'associazione stessa e lasciare gli oggetti di essere associati da soli, pur mantenendo questa RESTful?
In particolare, ho questi modelli:
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
Che sta dicendo che l'evento è :surveyable
(ModelSurvey belongs_to Event
). La mia domanda è, senza dover creare un ModelSurveysController
, come faccio a distruggere il ModelSurvey
, lasciando la Event
e Survey
solo?
Qualcosa con map.resources :events, :has_many => :model_surveys
? Io non sono del tutto sicuri di cosa fare in questa situazione. Che cosa deve accadere con i percorsi, e che cosa deve accadere nel controllore? Spero che l'URL potrebbe essere simile a questa:
/events/:title/model_surveys/:id
Grazie per il vostro aiuto, Lance
Soluzione
In Rails 2.3 avete accepts_nested_attributes_for
che lasceranno passare una serie di ModelSurveys per l'evento in questione. Se si consente di distruggere attraverso la dichiarazione di attributi nidificati, sarete in grado di passare event[model_surveys][1][_destroy]=1
e l'associazione verrà rimosso. Controlla la Documentazione API .
Altri suggerimenti
dominio Risorse! = Dominio modello
Il dominio del controller non è la stessa di quella dei modelli. E 'perfettamente bene per aggiornare più modelli cambiando lo stato di una risorsa.
Nel tuo caso, che significa fare una PUT o POST sia alla corsa o l'indagine, che contiene un elenco di ID per l'altro. Il modello per una aggiornerà sezione.
PUT o POST
Alcune persone (ma non Roy Fielding ) credono che si dovrebbe usare un PUT per aggiornare la risorsa e di fornire tutto lo stato di nuovo, altri ritengono che un post con lo stato parziale (PATCH ala) è sufficiente.