Пользователь удалил все свои сообщения, одно из которых было постом «О категории» для раздела. Мы восстановили сообщение и изменили владельца на учётную запись «Система», однако оно всё ещё отображается как «удалённое» для администратора, а при попытке просмотра этого сообщения обычным пользователем появляется ошибка:
При нажатии кнопки Удалить все сообщения на странице администратора пользователя удаляется тема «О нас». (В остальных случаях право собственности передаётся пользователю @system)
Можно создать новую категорию, переместить туда все темы и удалить старую категорию. Но это скорее временное решение, чем исправление.
Хотя я только что воспроизвёл это на своём тестовом сайте, и после восстановления тема снова появилась сразу же, поэтому я не уверен, в чём именно заключается эта конкретная проблема.
Возможно изменить topic_id темы «О нас» на новый через консоль Rails, но вариант с «переключением категории» может оказаться проще через интерфейс.
Мне, возможно, понадобится пошаговая инструкция, чтобы убедиться, что мы делаем одно и то же. Похоже, что был удалён пользователь, а не только его посты?
Существует две проблемы, которые особенно неприятны в сочетании.
Когда вы используете «Удалить все сообщения» на странице администратора пользователя, удаляется сообщение «О категории». (Но вы можете восстановить его.)
Когда у вас есть удалённые сообщения, автор которых также удалён, и вы меняете владельца перед восстановлением сообщения, вы не можете восстановить это сообщение. (В качестве обходного пути вы можете удалить тему и восстановить её. Это восстановит первое сообщение.)
Таким образом, если вы:
создадите тестового пользователя и тестовую категорию,
назначите тестового пользователя владельцем темы «О категории»,
удалите все его сообщения со страницы администратора пользователя,
(необязательно) создадите ещё одну тему, принадлежащую тестовому пользователю,
(необязательно) ответите в обеих темах от имени другого пользователя,
удалите тестового пользователя,
измените владельца темы «О категории» (и другой темы),
попытаетесь восстановить сообщения,
вы получите ошибку, так как не сможете восстановить сообщение. Примечание: ответы в темах видны другим пользователям, но они не могут увидеть первое сообщение.
Да, я считаю, что пользователь создал эту категорию.
Функция «Восстановить HTML» вроде бы ничего не изменила.
Можно, конечно, создать новую категорию и сделать подмену, но не потребует ли это от пользователей, которые подписались на оригинальную категорию, отключили уведомления или сделали что-то ещё, повторить эти действия для новой?
Я не боюсь консоли Rails, поэтому, если присвоение нового topic_id — это более «правильный» способ структурирования данных, то я склоняюсь к этому варианту. Но мне бы хотелось получить помощь с конкретными командами для выполнения; не будет ли это что-то вроде Category.find(10).topic_id = 723…?
С другой стороны:
…возможно, это более быстрый способ решения? (Хотя я вижу в меню с иконкой гаечного ключа только «Архивировать тему», а не «Удалить тему»…)
Я не проверял это так тщательно, как другие здесь (спасибо!!), но, на мой взгляд, исправление проблемы, описанной в первом сообщении, довольно простое.
не разрешать удаление тем «О себе» в админке пользователей (со стороны модераторов/администраторов сайта)
При попытке выполнить вышеуказанное действие следует блокировать его и отображать информационное сообщение об ошибке. Я перемещаю эту задачу в Contribute > 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!!