2009-02-27 5 views
1

Wie können Sie Datensätze auf eine Weise zurücksetzen, die REST-Konventionen und Routing berücksichtigt?Rails & Acts-as-versioned: Wie würden Sie Datensätze wiederherstellen?

Ich bin auf der Suche nach Beispielen, wie ich meine routes.rb einrichten und den Link & Controller-Aktion erstellen, um die Rückstellung zu tun. Alle Beispiele, die ich gefunden habe, sind Pre-REST-Schienen.

Mein Verständnis ist, dass ich die Funktion "revert_to_version" in meinem Ressourcen-Controller haben muss.

Antwort

8

Ich habe nie Acts-as-Versioned im Besonderen verwendet, aber wenn ich auf ähnliche Szenarien stoße, ist die Art, wie ich es normalerweise löse, durch Verdinglichung des Attributs. Mit anderen Worten, ich würde eine neue Ressource nur für die tatsächliche Versionsnummer der Ressource erstellen.

Eg.

/resources/:id/actual_version 

würde auf die tatsächliche Versionsnummer der Ressource mit ID: ID verweisen. Um dann die aktuelle Version zu ändern, können wir einfach die gewünschte Nummer eingeben.

PUT /resources/:id/actual_version 
:version = 123 

würde unsere Ressourcen auf die Version wiederherstellen 123

Als Konvention ich so etwas wie „last-but-one“ verwenden würde, als ein Wert von: Version auf die Version zu beziehen, die voran der tatsächliche.

Dann die aktuelle Version rückgängig zu machen, können wir nur tun:

PUT /resources/:id/actual_version 
:version=last-but-one 

-

meine eigene Antwort Expanding:

In routes.rb wir so etwas wie tun:

map.connect '/resources/:id/actual_version', :controller => 'resources', :action => 'set_version', :conditions => { :method => :put } 

Und in 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 

Hoffe, dass meine früheren Gedanken ein wenig geklärt hat. ;)

0

Ich nehme an, Sie rollen Ihr eigenes System. Meine Antwort bezieht sich nicht auf ein bestimmtes Versions-Plugin.

Da Ihre URLs Pfade zu Ressourcen sind, würde ich den Revisionsparameter als optional betrachten. Sie können es auslassen und die neueste Revision abrufen oder die Revision in der Reihenfolge angeben.

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

Das Gleiche gilt für die Bearbeitung.

PUT zu/pages/1 würde eine neue Revision erstellen und die Versionsnummer um eins erhöhen. Die neue Versionsnummer wird ohne Berücksichtigung der aktuellen Revisionsnummer erstellt. Es ist nur ein Ausgangspunkt beim Editieren.

Offensichtlich sollte es unmöglich sein, eine Revision für einen POST auf/pages (create) zu spezifizieren.

Wenn Sie Rücksprünge insbesondere verfolgen möchten und der oben erwähnte Bearbeitungsstartpunkt nicht ausreicht, gibt es einige sinnvolle Alternativen. Ich bin kein REST-Geek, also bin ich mir nicht sicher, welches du wählen solltest. Vielleicht ist es eine Frage des Geschmacks.

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

Ein Codebeispiel für die erste 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 

Wenn Sie mit diesem rollen, ist es sinn wahrscheinlich macht/GET Seiten/1/Revisionen/4 4 die Seite für die Revision angezeigt werden, anstelle von GET/pages/1? revision = 4.

Verwandte Themen