Пользователь удалил все свои сообщения, одно из которых было постом «О категории» для раздела. Мы восстановили сообщение и изменили владельца на учётную запись «Система», однако оно всё ещё отображается как «удалённое» для администратора, а при попытке просмотра этого сообщения обычным пользователем появляется ошибка:
При нажатии кнопки Удалить все сообщения на странице администратора пользователя удаляется тема «О нас». (В остальных случаях право собственности передаётся пользователю @system)
Можно создать новую категорию, переместить туда все темы и удалить старую категорию. Но это скорее временное решение, чем исправление.
Хотя я только что воспроизвёл это на своём тестовом сайте, и после восстановления тема снова появилась сразу же, поэтому я не уверен, в чём именно заключается эта конкретная проблема.
Возможно изменить topic_id темы «О нас» на новый через консоль Rails, но вариант с «переключением категории» может оказаться проще через интерфейс.
Мне, возможно, понадобится пошаговая инструкция, чтобы убедиться, что мы делаем одно и то же. Похоже, что был удалён пользователь, а не только его посты?
Существует две проблемы, которые особенно неприятны в сочетании.
Когда вы используете «Удалить все сообщения» на странице администратора пользователя, удаляется сообщение «О категории». (Но вы можете восстановить его.)
Когда у вас есть удалённые сообщения, автор которых также удалён, и вы меняете владельца перед восстановлением сообщения, вы не можете восстановить это сообщение. (В качестве обходного пути вы можете удалить тему и восстановить её. Это восстановит первое сообщение.)
Таким образом, если вы:
создадите тестового пользователя и тестовую категорию,
назначите тестового пользователя владельцем темы «О категории»,
удалите все его сообщения со страницы администратора пользователя,
(необязательно) создадите ещё одну тему, принадлежащую тестовому пользователю,
(необязательно) ответите в обеих темах от имени другого пользователя,
удалите тестового пользователя,
измените владельца темы «О категории» (и другой темы),
попытаетесь восстановить сообщения,
вы получите ошибку, так как не сможете восстановить сообщение. Примечание: ответы в темах видны другим пользователям, но они не могут увидеть первое сообщение.
Да, я считаю, что пользователь создал эту категорию.
Функция «Восстановить HTML» вроде бы ничего не изменила.
Можно, конечно, создать новую категорию и сделать подмену, но не потребует ли это от пользователей, которые подписались на оригинальную категорию, отключили уведомления или сделали что-то ещё, повторить эти действия для новой?
Я не боюсь консоли Rails, поэтому, если присвоение нового topic_id — это более «правильный» способ структурирования данных, то я склоняюсь к этому варианту. Но мне бы хотелось получить помощь с конкретными командами для выполнения; не будет ли это что-то вроде Category.find(10).topic_id = 723…?
С другой стороны:
…возможно, это более быстрый способ решения? (Хотя я вижу в меню с иконкой гаечного ключа только «Архивировать тему», а не «Удалить тему»…)
Я не тестировал это так тщательно, как другие здесь (спасибо!!), но, на мой взгляд, исправление указанной проблемы в первом сообщении довольно простое.
Не разрешать удаление тем «О нас» в панели управления пользователями (модераторами/администраторами сайта).
При попытке выполнить это действие следует предотвратить его и отобразить информативное сообщение об ошибке. Я перемещаю это в bug, так как это ошибка: темы «О нас» можно удалять в указанном случае.
Я только что создал тестового пользователя, использовал его для создания категории, а затем удалил пользователя через панель управления пользователями. Система позволила удалить пользователя напрямую, даже если у него была тема. Авторство темы «О нас» было передано системному пользователю! Таким образом, по крайней мере, этот сценарий использования кажется относительно безопасным в этом отношении.
Я также попробовал случай самоудаления (сначала нужно понизить уровень пользователя, чтобы увидеть кнопку «Удалить учётную запись»). Удаление этого пользователя также привело к передаче авторства темы системному пользователю. Кроме того, я заметил, что значение по умолчанию для delete user self max post count установлено в 1, что означает, что по умолчанию пользователь не может удалить себя, если у него больше одной темы. Так что в этом плане мы в безопасности.
Также я протестировал удаление пользователя через панель управления пользователями. Интересно, что пока была только одна тема «О нас», кнопка удаления сообщения не отображалась. Но после создания второй темы кнопка появилась. Выбрав её и введя длинный текст для подтверждения, я смог удалить сообщения пользователя, включая тему «О нас». Наконец, воспроизведение ошибки!
И наконец, я также смог удалить тему «О нас» с помощью массовых действий. Ещё одно воспроизведение! Ой, теперь вижу, что у меня нет воспроизведения удаления тем «О нас» через массовые действия. Система просто молча не выполняет это действие.
Учитывая вышесказанное, мы можем игнорировать случаи удаления пользователя (через панель управления пользователями и самоудаление), поскольку авторство передаётся системе.
Я также попытался переместить пост «О нас» в другую тему. Это работает, и появляется таймер удаления, но тема не удаляется через x дней. Таймер просто исчезает. Так что это работает нормально.
Это, вероятно, предотвратит повторение ситуации в будущем.
Тем не менее, как мне восстановить ситуацию сейчас, когда пользователи видят страницу ошибки при попытке прочитать пост «О нас» для этой категории, хотя пост принадлежит пользователю system?
Я пока ничего не пробовал; я надеялся, что кто-нибудь вмешается и скажет либо «да, это правильная команда», либо «нет, не делай этого, всё испортится»…
@alxndr, подтвердите, пожалуйста, что вы используете собственное хостинг-решение, а не наше. Если вы находитесь на нашем хостинге или планируете перейти на него, вы можете обратиться в нашу команду за поддержкой — один из технических специалистов поможет вам решить эту проблему.
Если бы я был на вашем месте, я бы просто создал новую категорию и перенёс все темы в неё. Это кажется самым простым решением.
Если вы решите поэкспериментировать с консолью Rails или API, имейте в виду, что вы входите в неизведанную зону, поэтому обязательно сделайте полную резервную копию своего сайта на случай, если потребуется откатить изменения!
Ха Похоже, ты не доверяешь моим советам @tobiaseigen
Использование API было бы более безопасным вариантом, чем консоль Rails, но пока неясно, удастся ли с его помощью восстановить именно эту тему в данных обстоятельствах.
Я не был уверен, что API сработает, так как аналогичные действия в интерфейсе блокировались, но мне вроде бы удалось добиться успеха (:partying_face).
В данном случае я использовал endpoint для восстановления поста, а не темы (именно это пыталась сделать кнопка «Восстановить» в посте):
Кнопка «восстановить этот пост», похоже, использует эту конечную точку, однако она возвращает ошибку 403, при этом errorThrown пуст, а textStatus: "error".
Однако вы утверждаете, что использование того же маршрута через API, а не веб-интерфейс, сработало?
По моим тестам, кнопка восстановления пыталась использовать endpoint восстановления темы (/t/TOPIC_ID/recover) и выдавала ошибку 403. Однако при использовании версии восстановления поста всё работало нормально.
Я не совсем понимаю, как определить ID отдельного сообщения; ID категории — 10, и, думаю, ID темы — 723? Обновление: Ага, нашёл! На элементе DOM <article> есть атрибут data-post-id…
Я не вижу этой конечной точки в документации API… неужели это должен быть PUT? С какими-либо данными? Обновление: Да, PUT, без данных — сработало! Спасибо, @JammyDodger!!