Я никогда не пользовался актами, как, в частности, версиями, но когда я сталкиваюсь с похожими сценариями, то, как я обычно решаю это, - это овеществление атрибута. Другими словами, я бы создал новый ресурс только для фактического номера версии ресурса.
Например.
/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
Надеюсь, что мои предыдущие мысли немного разъяснили. ;)