2009-02-27 2 views
1

RESTの規則とルーティングを尊重してレコードを元に戻すにはどうすればよいですか?Rails&Acts-as-versioned:どうやってレコードを元に戻しますか?

私はの例を探していますどのようにセットアップ私のroutes.rbををして復帰を行うためのリンク&コントローラのアクションを構築します。私が見つけたすべての例は、事前RESTレールです。

私の理解では、私のリソースコントローラでrevert_to_version機能が必要です。

答えて

8

特に、バージョンとして-行為を-Iを使用したことはありませんが、私は同様のシナリオに遭遇したとき、私は通常、それを解決する方法は属性の具体化です。 つまり、リソースの実際のバージョン番号に対してのみ新しいリソースを作成します。

例:

/resources/:id/actual_version 

は、id:idのリソースの実際のバージョン番号を示します。 実際のバージョンを変更するには、希望の番号を入力してください。先行バージョンを参照するバージョン:

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

は慣例としてバージョン123

に私たちのリソースを元に戻すだろう、私はの値として「最後の-が、-1」のようなものを使用したいです実際のものです。

次に、実際のバージョンをロールバックするために、我々はやるだけのことができます: - :私たちは同じような何かを行うことができますroutes.rbをで

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

は自分の答えを拡大

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

そして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 

私の以前の考えを明らかにビット・ホープ。 ;)

0

私はあなた自身のシステムを動かしていると仮定します。私の答えは、特定のバージョン管理プラグインには関係しません。

URLはリソースへのパスなので、私はリビジョンパラメータをオプションと見なします。それを離れて最新のリビジョンを取得するか、リビジョンを明示的に指定することができます。

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

同じように編集します。 /ページ/ 1に

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

PUTは1で、バージョン番号をインクリメントし、新しいリビジョンを作成します。新しいバージョン番号は、現在のリビジョン番号に関係なく作成されます。それは単に編集の出発点です。

明らかに、/ pages(create)へのPOSTのリビジョンを指定することは不可能です。

特にリバーブをトラッキングしていて、上記の編集開始点では十分でない場合は、いくつかの選択肢があります。私はRESTオタクではないので、どちらを選ぶべきかはわかりません。多分それは味の問題です。

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

最初の代替用のコード例:あなたはこれでロールした場合、それはおそらくGETすることは理にかなって

# 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 

/ページ/ 1 /リビジョン/ 4改訂4用のページを表示するには、 GET/pages/1?revision = 4の代わりに。