Как выбросить ошибку из блока PostRevisor и отобразить её пользователю?

Вот фрагмент кода, куда я хочу добавить дополнительную валидацию

(упрощённый код и сценарий использования)

# предотвратить изменение категории темы пользователями без прав персонала
  PostRevisor.track_topic_field(:category_id) do |tc, category_id|
    if tc.guardian.is_staff?
      tc.record_change('category_id', tc.topic.category_id, category_id)
      tc.topic.category_id = category_id
    else
       tc.topic.errors[:base] << "вы не можете изменить категорию для этого типа темы"
    end
  end

Этот код предотвращает изменение категории пользователями без прав персонала, но не выводит ошибку.

Раньше это работало:

https://github.com/discourse/discourse-tagging/blob/84a99dffe5e3a10d2b0b8e9421bf3714378e0230/plugin.rb#L405

Однако этот плагин был впоследствии заархивирован.

Разве эта функциональность не должна поддерживаться API?

Ты лучше разбираешься в этом, чем я, но мне кажется, что Rails не должен пробрасывать это обратно, поскольку ожидается, что Ember не позволит пользователю выбрать категорию, которую он не должен выбирать. Так что, возможно, стоит убедиться, что фронтенд не даст им изменить категорию, если они не должны этого делать, чтобы PostRevisor никогда не сталкивался с этой неловкой ситуацией?

Да, конечно, это стоит учесть.

Хорошей практикой считается сначала ограничивать доступ на уровне API, а затем уже на фронтенде, если это возможно. То есть никогда не следует полагаться только на фронтенд для предотвращения недопустимых действий.

Кроме того, фронтенд должен передавать ошибки Active Record.

Поэтому выполнение этой проверки на уровне API крайне важно.

Согласен. Вы хотите, чтобы Rails обеспечивал это.

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

Да, вы правы.

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

Поэтому всплывающая ошибка была бы очень кстати.

Жесткость шаблонов .gjs делает такие изменения сейчас очень сложными.

Этот шаблон всё ещё HBS, но я не хочу его переопределять по очевидным причинам.

Я попробую CSS-хак.

Опять же, ты в этом лучше меня, но я думал, что можно скрыть селектор категорий похоже, это не сработает.

Так что, возможно, стоит взломать сериализатор категорий, чтобы он не отправлял никаких категорий. Хотя это кажется сложным, ведь нужно будет понять, как взломать его только при редактировании темы, а не при её создании.

“Хак” сработал :tada: :

Мне всё ещё хотелось бы получить от сервера подробный и осмысленный ответ, особенно использующий Active Record.

Столкнулся с таким же поведением и не знал, что делать. Вся моя разработка и тестирование осуществляются через API-запросы, так как на фронтенде пока ничего нет, поэтому я был сбит с толку, когда ответы, которые я получал, выглядели как успешные. Я думал, что мои проверки полностью неработоспособны, пока не собрал минимальный отладчик и не прошел через пошаговое выполнение.

edit:
Хм… решил полностью перезагрузить окружение, и оно начало возвращать сообщения об ошибках в ответе API.