2009-02-27 4 views
1

어떻게 REST 규칙과 라우팅을 존중하는 방식으로 레코드를 되돌릴 수 있습니까?Rails & Acts-as-versioned : 어떻게하면 안심하고 레코드를 되돌릴 수 있습니까?

내 routes.rb를 설정하는 방법의 예를 찾고 되돌리기를 수행하기 위해 컨트롤러 동작 & 컨트롤러 조치를 작성하십시오. 내가 찾은 모든 예는 사전 REST 레일입니다.

내 이해는 내 리소스 컨트롤러에서 revert_to_version 기능이 있어야한다는 것입니다.

답변

8

저는 특히 행위와 같이 버전을 사용하지는 않았지만, 비슷한 시나리오를 발견 할 때 일반적으로 해결 방법은 속성을 구체화하는 것입니다. 즉, 리소스의 실제 버전 번호에 대해서만 새 리소스를 만듭니다.

예 :

/resources/:id/actual_version 

은 id가 id 인 자원의 실제 버전 번호를 가리 킵니다. 실제 버전을 변경하려면 원하는 번호를 입력하면됩니다.

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

내가 좋아하는 뭔가를 사용하는 것, 컨벤션으로 버전 123

에 우리의 자원을 되돌릴 것 "마지막하지만 - 하나"의 값 : 선행 버전을 참조하는 버전 실제 것.

그런 다음, 실제 버전을 롤백하기 위해, 우리는 다만 할 수 있습니다 : - : 우리처럼 뭔가를 할 수 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 

내 이전의 생각을 조금 분명하게 해주는 희망. ;)

0

당신이 자신의 시스템을 사용하고 있다고 가정합니다. 내 답변은 특정 버전 플러그인과 관련이 없습니다.

URL이 리소스 경로이기 때문에 수정 매개 변수는 선택 사항으로 간주합니다. 그것을 버리고 최신 개정판을 가져 오거나 명시 적으로 개정판을 지정할 수 있습니다.

 
GET /pages/1 
GET /pages/1?revision=4 

편집 중입니다.

 
GET /pages/1/edit 
GET /pages/1/edit?revision=4 

PUT to/pages/1은 버전 번호를 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 대신에.

관련 문제