如何以尊重 REST 约定和路由的方式恢复记录?
我正在寻找如何设置我的 routes.rb 并构建链接和控制器操作以进行还原的示例。我发现的所有示例都是 pre-REST rails。
我的理解是我的资源控制器中需要有 revert_to_version 函数。
如何以尊重 REST 约定和路由的方式恢复记录?
我正在寻找如何设置我的 routes.rb 并构建链接和控制器操作以进行还原的示例。我发现的所有示例都是 pre-REST rails。
我的理解是我的资源控制器中需要有 revert_to_version 函数。
我从来没有特别使用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
希望这能澄清我以前的想法。;)
我假设您正在滚动自己的系统。我的回答与任何特定的版本控制插件无关。
因为您的 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 可能是有意义的。