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