Могу ли я использовать papertrail для хранения изменений, ожидающих подтверждения?
Мне нужно разрешить менее привилегированным пользователям предлагать изменения в записи, но они должны где-то сидеть, пока администратор не утвердит их. Это должно быть похоже на то, как переполнение стека позволяет пользователям с более низкой репутацией предлагать редактирование вопроса или ответа, которые должны быть рассмотрены кем-либо с более высокой репутацией.
С точки зрения бумажного следа, я хотел бы позволить пользователям создавать версии записи без фактического внесения этих изменений в саму запись - будущие версии, а не прошлые версии. Затем я хотел бы разрешить другому пользователю "вернуться" ("prevert"?) К новой версии.
Это что-то поддерживает papertrail? Или есть другой драгоценный камень, который может сделать это?
2 ответа
Я знаю, что этот вопрос очень старый, но позвольте мне объяснить, как мне удалось его решить:
Предположим, что у меня есть модель Post
, два пользователя: A
а также B
, тот A
разрешено обновлять посты но ему нужно B
утверждение перед внесением изменений, B
это монитор, который может утверждать обновления, а также может обновлять сообщения.
- Я добавил метод для возврата записи к определенной версии, чтобы мы могли обновить ее до любой версии, которую мы хотим:
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, но немного его изменил.
- Хитрость заключается в том, чтобы не обновлять саму запись, если текущий пользователь
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
- я добавил
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
Стоит мы им.
Ммм.. Я думаю об этом..
Пожалуйста, дайте мне знать, если вы нашли лучшее решение!