RESTの規則とルーティングを尊重する方法でレコードを元に戻すにはどうすればよいですか?
私はroutes.rbをセットアップし、元に戻すためのリンクとコントローラーのアクションを作成する方法の例を探しています。私が見つけたすべての例は、REST前のレールです。
私の理解では、リソースコントローラーにrevert_to_version関数が必要です。
RESTの規則とルーティングを尊重する方法でレコードを元に戻すにはどうすればよいですか?
私はroutes.rbをセットアップし、元に戻すためのリンクとコントローラーのアクションを作成する方法の例を探しています。私が見つけたすべての例は、REST前のレールです。
私の理解では、リソースコントローラーにrevert_to_version関数が必要です。
特にバージョンとして機能を使用したことはありませんが、同様のシナリオに遭遇した場合、通常は属性を具体化することで解決します。つまり、リソースの実際のバージョン番号に対してのみ新しいリソースを作成します。
例えば。
/resources/:id/actual_version
id :id を持つリソースの実際のバージョン番号を指します。次に、実際のバージョンを変更するには、必要な番号を PUT するだけです。
PUT /resources/:id/actual_version
:version = 123
リソースをバージョン 123 に戻します。
慣習として、実際のバージョンよりも前のバージョンを参照するために、:version の値として「last-but-one」のようなものを使用します。
次に、実際のバージョンをロールバックするには、次のようにします。
PUT /resources/:id/actual_version
:version=last-but-one
--
私自身の答えを拡張する:
routes.rb では、次のようなことができます。
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
編集についても同様です。
GET / pages / 1 / edit GET / pages / 1 / edit?revision = 4
/ pages / 1にPUTすると、新しいリビジョンが作成され、バージョン番号が1つ増えます。新しいバージョン番号は、現在のリビジョン番号に関係なく作成されます。これは、編集時の出発点にすぎません。
明らかに、/ pagesへのPOST(作成)のリビジョンを指定することは不可能です。
特に復帰を追跡したい場合で、上記の編集の開始点では不十分な場合は、いくつかの賢明な代替手段があります。私はRESTオタクではないので、どちらを選ぶべきかわかりません。おそらくそれは好みの問題です。
PUT / pages / 1 / Revisions / 4 PUT / pages / 1 / reverse_to?revision = 4 PUT / pages / 1?revision = 4
最初の選択肢のコード例:
# 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
これを使用する場合は、GET / pages / 1?revision = 4ではなく、GET / pages / 1 / Revisions/4を使用してリビジョン4のページを表示するのが理にかなっています。