2009-02-27 4 views
1

Как вы можете отменить записи таким образом, чтобы они соответствовали соглашениям REST и маршрутизации?Rails & Acts-as-versioned: Как бы вы спокойно вернули записи?

Я ищу примеры того, как настроить мои маршруты.rb и построить ссылку & действие контроллера, чтобы сделать возврат. Все примеры, которые я нашел, представляют собой рельсы REST.

Я понимаю, что мне нужно иметь функцию revert_to_version в моем контроллере ресурсов.

ответ

8

Я никогда не пользовался актами, как, в частности, версиями, но когда я сталкиваюсь с похожими сценариями, то, как я обычно решаю это, - это овеществление атрибута. Другими словами, я бы создал новый ресурс только для фактического номера версии ресурса.

Например.

/resources/:id/actual_version 

будет указывать на фактический номер версии ресурса с id: id. Затем, чтобы изменить фактическую версию, мы можем просто нажать на нее нужный номер.

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

вернется наш ресурс до версии 123.

В конвенции, я хотел бы использовать что-то вроде «последний, но один» в качестве значения: версии для обозначения версии, предшествовавшей фактический.

Затем откатить актуальную версию, мы можем только сделать:

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 

Надеюсь, что мои предыдущие мысли немного разъяснили. ;)

0

Предполагаю, что вы переворачиваете свою собственную систему. Мой ответ не относится к какому-то определенному плагину для версий.

Поскольку ваши URL-адреса являются путями к ресурсам, я бы рассмотрел параметр ревизии как необязательный. Вы можете оставить его и получить последнюю версию, или уточнить ревизию.

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

То же самое касается редактирования.

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

PUT to/pages/1 создаст новую ревизию, увеличив число версий на единицу. Номер новой версии создается независимо от текущего номера версии. Это просто отправная точка при редактировании.

Очевидно, что было бы невозможно указать ревизию для POST на/pages (create).

Если вы хотите отслеживать реверты, в частности, и упомянутую выше начальную точку редактирования недостаточно, есть несколько разумных альтернатив. Я не REST Geek, поэтому я не уверен, что вы должны выбрать. Возможно, это вопрос вкуса.

 
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/страниц/1/изменения/4, чтобы отобразить страницу для пересмотра 4, вместо GET/pages/1? revision = 4.