2009-02-27 9 views
1

Comment pouvez-vous restaurer les enregistrements d'une manière qui respecte les conventions et le routage REST?Rails & Acts-as-versioned: Comment inverseriez-vous les records?

Je cherche des exemples de comment configurer mes routes.rb et construis le lien & action de contrôleur pour faire le retour. Tous les exemples que j'ai trouvés sont des rails pré-REST. D'après ce que je comprends, j'ai besoin de la fonction revert_to_version dans mon contrôleur de ressources.

Répondre

8

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. ;)

0

Je suppose que vous roulez votre propre système. Ma réponse ne concerne aucun plugin de versioning particulier. Parce que vos URL sont des chemins vers des ressources, je considérerais le paramètre de révision comme facultatif. Vous pouvez le laisser, et obtenir la dernière révision, ou spécifier la révision eplicitly.

 
GET /pages/1 
GET /pages/1?revision=4 

Il en va de même pour l'édition.

PUT to/pages/1 créerait une nouvelle révision en incrémentant le numéro de version de un. Le nouveau numéro de version est créé sans tenir compte du numéro de révision actuel. C'est simplement un point de départ lors de l'édition.

Évidemment, il devrait être impossible de spécifier une révision pour un POST vers/pages (create).

Si vous souhaitez effectuer le suivi des réverbérations en particulier, et que le point de départ de l'édition mentionné ci-dessus n'est pas suffisant, il existe quelques alternatives judicieuses. Je ne suis pas un geek REST, donc je ne suis pas sûr de savoir lequel choisir. Peut-être que c'est une question de goût.

 
PUT /pages/1/revisions/4 
PUT /pages/1/revert_to?revision=4 
PUT /pages/1?revision=4 

Un exemple de code pour la première alternative:

# config/routes.rb 
map.resources :pages do |page| 
    page.resources :revisions 
end 

# app/controllers/revisions_controller.rb 
class RevisionsController < ApplicationController 
    def update 
    @page = Page.find(params[:page_id]) # page_id is via /pages/[page_id]/revisions/4 
    @revision = @page.revisions.find_by_version_number(params[:id]) 
    @revision.revert 
    end 
end 

# app/models/revision.rb 
class Revision < ActiveRecord::Base 
    belongs_to :page 

    def revert 
    page.revert_to(self) # or something like that.. 
    end 
end 

Si vous roulez avec cela, il est probablement logique de GET/pages/1/révisions/4 pour afficher la page de révision 4, au lieu de GET/pages/1? revision = 4.