1

如何以尊重 REST 约定和路由的方式恢复记录?

我正在寻找如何设置我的 routes.rb 并构建链接和控制器操作以进行还原的示例。我发现的所有示例都是 pre-REST rails。

我的理解是我的资源控制器中需要有 revert_to_version 函数。

4

2 回答 2

8

我从来没有特别使用acts-as-versioned,但是当我遇到类似的场景时,我通常解决它的方法是通过属性的具体化。换句话说,我只会为资源的实际版本号创建一个新资源。

例如。

/resources/:id/actual_version

将指向具有 id :id 的资源的实际版本号。然后要更改实际版本,我们只需将所需的数字输入即可。

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

会将我们的资源恢复到版本 123。

作为惯例,我会使用“last-but-one”之类的东西作为 :version 的值来引用实际版本之前的版本。

然后,要回滚实际版本,我们可以这样做:

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 是资源的路径,所以我认为修订参数是可选的。您可以忽略它,并获取最新的修订版,或者明确指定修订版。

获取 /pages/1
获取 /pages/1?revision=4

编辑也是如此。

获取 /pages/1/编辑
获取 /pages/1/edit?revision=4

PUT to /pages/1 将创建一个新修订版,将版本号加一。新版本号的创建与当前修订号无关。这只是编辑时的一个起点。

显然,应该不可能为 /pages(创建)的 POST 指定修订版。

如果您特别想跟踪还原,并且上面提到的编辑起点还不够,那么有一些明智的选择。我不是 REST 极客,所以我不确定你应该选择哪一个。也许这是一个品味问题。

PUT /pages/1/revisions/4
PUT /pages/1/revert_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/revisions/4 来显示修订版 4 的页面而不是 GET /pages/1?revision=4 可能是有意义的。

于 2009-03-14T16:50:15.370 回答