RESTの規則とルーティングを尊重してレコードを元に戻すにはどうすればよいですか?Rails&Acts-as-versioned:どうやってレコードを元に戻しますか?
私はの例を探していますどのようにセットアップ私のroutes.rbををして復帰を行うためのリンク&コントローラのアクションを構築します。私が見つけたすべての例は、事前RESTレールです。
私の理解では、私のリソースコントローラでrevert_to_version機能が必要です。
RESTの規則とルーティングを尊重してレコードを元に戻すにはどうすればよいですか?Rails&Acts-as-versioned:どうやってレコードを元に戻しますか?
私はの例を探していますどのようにセットアップ私のroutes.rbををして復帰を行うためのリンク&コントローラのアクションを構築します。私が見つけたすべての例は、事前RESTレールです。
私の理解では、私のリソースコントローラでrevert_to_version機能が必要です。
特に、バージョンとして-行為を-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
私の以前の考えを明らかにビット・ホープ。 ;)
私はあなた自身のシステムを動かしていると仮定します。私の答えは、特定のバージョン管理プラグインには関係しません。
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の代わりに。