1

RESTの規則とルーティングを尊重する方法でレコードを元に戻すにはどうすればよいですか?

私はroutes.rbをセットアップし、元に戻すためのリンクとコントローラーのアクションを作成する方法の例を探しています。私が見つけたすべての例は、REST前のレールです。

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

4

2 に答える 2

8

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

例えば。

/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

それが私の以前の考えを少し明確にしたことを願っています。;)

于 2009-02-27T14:13:17.343 に答える
0

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

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のページを表示するのが理にかなっています。

于 2009-03-14T16:50:15.370 に答える