Rails & Acts-as-versioned: Как бы вы спокойно возвращали записи? - PullRequest
1 голос
/ 27 февраля 2009

Как вы можете вернуть записи таким образом, чтобы они соответствовали соглашениям REST и маршрутизации?

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

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

Ответы [ 2 ]

8 голосов
/ 27 февраля 2009

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

Например.

/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

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

0 голосов
/ 14 марта 2009

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

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

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

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

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

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

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

Если вы хотите, в частности, отслеживать возвраты, и упомянутой выше начальной точки редактирования недостаточно, есть несколько разумных альтернатив. Я не гик 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...