Je n'ai jamais utilisé des actes-comme-versionnés en particulier, mais quand je tombe sur des scénarios similaires, la façon dont je le résous habituellement est la réification de l'attribut. En d'autres termes, je créerais une nouvelle ressource uniquement pour le numéro de version réel de la ressource.
Par exemple.
/resources/:id/actual_version
pointerait vers le numéro de version actuel de la ressource avec id: id. Ensuite, pour changer la version actuelle, nous pouvons simplement METTRE le numéro désiré.
PUT /resources/:id/actual_version
:version = 123
retournerait notre ressource à la version 123.
Par convention, j'utiliser quelque chose comme « avant-dernière un » comme une valeur de: la version pour se référer à la version qui a précédé le vrai.
Ensuite, rollback la version actuelle, nous pouvons simplement faire:
PUT /resources/:id/actual_version
:version=last-but-one
-
Élargir ma propre réponse:
En routes.rb nous pouvons faire quelque chose comme:
map.connect '/resources/:id/actual_version', :controller => 'resources', :action => 'set_version', :conditions => { :method => :put }
Et dans resources_controller.rb:
def set_version
@resource = Resource.find_by_id(params[:id])
if params[:version] && @resource
version = params[:version] == "last-but-one" ? @resource.versions.last : params[:version]
if @resource.revert_to(version)
# Success, everything went fine!
else
# Error, the resource couldn't be reverted - unexisting version?
end
else
# Error, version number or resource id is missing.
end
end
Espoir qui a clarifié un peu mes pensées précédentes. ;)