Могу ли я использовать papertrail для хранения изменений, ожидающих подтверждения?

Мне нужно разрешить менее привилегированным пользователям предлагать изменения в записи, но они должны где-то сидеть, пока администратор не утвердит их. Это должно быть похоже на то, как переполнение стека позволяет пользователям с более низкой репутацией предлагать редактирование вопроса или ответа, которые должны быть рассмотрены кем-либо с более высокой репутацией.

С точки зрения бумажного следа, я хотел бы позволить пользователям создавать версии записи без фактического внесения этих изменений в саму запись - будущие версии, а не прошлые версии. Затем я хотел бы разрешить другому пользователю "вернуться" ("prevert"?) К новой версии.

Это что-то поддерживает papertrail? Или есть другой драгоценный камень, который может сделать это?

2 ответа

Я знаю, что этот вопрос очень старый, но позвольте мне объяснить, как мне удалось его решить:

Предположим, что у меня есть модель Post, два пользователя: A а также B, тот A разрешено обновлять посты но ему нужно B утверждение перед внесением изменений, B это монитор, который может утверждать обновления, а также может обновлять сообщения.

  1. Я добавил метод для возврата записи к определенной версии, чтобы мы могли обновить ее до любой версии, которую мы хотим:
def revert_to(version)
    raise 'not version of this model' unless self == version.item
    changes = version.changeset.select{ |k, v| not SKIP_FIELDS.include?(k) }.map{ |k,v| [k.to_sym, v[1]] }.to_h
    self.update_attributes(changes)
end

Я получил этот метод из ответа Stackru, но немного его изменил.

  1. Хитрость заключается в том, чтобы не обновлять саму запись, если текущий пользователь A не авторизован для изменения, а не обновления, будет создана новая версия Paper Trail, затем монитор B может принять новые изменения, вернув исходную запись к этой версии.

Для этого я использовал функцию из ядра Paper Trail paper_trail.record_update(),

A:

p = Post.find(1)
p.title = "A new pending version"
p.paper_trail.record_update(nil)

В качестве монитора:

p = Publication.find(1)
p.revert_to(p.versions.last)

В качестве редактора:

p = Publication.find(1)
p.title = "p will be updated to this version immediately"
p.paper_trail.record_update(nil)
p.save
  1. я добавил has_paper_trail Размещать модель, но я ограничил ее действиями по созданию и уничтожению, потому что, как я сказал выше, я не хочу, чтобы новая версия создавалась после обновления, я хочу, чтобы она создавалась раньше.
has_paper_trail :on => [:create, :destroy]

Я сталкиваюсь с той же проблемой прямо сейчас.

Нет, это не поддерживается paper_trail, но, возможно, мы сможем добиться этого, добавив approved приписать нашей записи. По умолчанию он должен иметь значение false, чтобы при сохранении объекта Record создавалась новая версия paper_trail с этим атрибутом, установленным в false. Позже AdminUser может утвердить настройку записи approved в true, и paper_trail создаст новую утвержденную версию.

Это не самое чистое решение, но оно должно работать. И мы могли бы также добавить другие атрибуты к вашей модели записи, такие как approved_by а также approved_atСтоит мы им.

Ммм.. Я думаю об этом..

Пожалуйста, дайте мне знать, если вы нашли лучшее решение!

Другие вопросы по тегам