¿Cómo lanzar un error desde un bloque PostRevisor y que se muestre al usuario?

Aquí hay un poco de código donde quiero agregar validación adicional

(código y caso de uso simplificados)

# evitar que el personal no autorizado cambie la categoría de un tema
  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] << "no puedes cambiar la categoría de este tipo de tema"
    end
  end

esto evitará que la categoría sea cambiada por personal no autorizado, pero no generará un error.

Esto solía funcionar:

Sin embargo, ese plugin ha sido archivado.

¿No debería este requisito ser compatible con la API?

Eres mejor en estas cosas que yo, pero pensaría que Rails no necesita comunicar esto porque se espera que Ember no permita al usuario seleccionar una categoría que no sea una que el usuario deba seleccionar. Entonces, ¿quizás asegurarse de que el front-end les impida cambiar la categoría si no se supone que deben hacerlo, para que PostRevisor nunca se enfrente a esta incómoda situación?

1 me gusta

Sí, claro, eso es una consideración.

Es una buena práctica limitar primero en el extremo de la API, luego en el front-end si puedes hacerlo; es decir, nunca debes depender solo del front-end para evitar una acción ilegal.

Además, el front-end debería mostrar los errores de Active Record.

Por lo tanto, realizar esto en la API es importante.

De acuerdo. Quieres que Rails lo imponga.

Pensé que entendía que estaba imponiendo el requisito y negándose a hacer el cambio, pero simplemente no proporcionaba un error lo suficientemente bueno al front-end.

1 me gusta

Sí, tienes razón.

Solo estoy intentando evitar un cambio de categoría, por lo que la interfaz de usuario es un tanto inútil, ya que está diseñada para permitirle cambiar todos los metadatos o ninguno.

Por lo tanto, un error que se propague sería muy útil.

La rigidez de las plantillas .gjs hace que este tipo de cambios sean muy complicados ahora.

Esta plantilla sigue siendo hbs, pero no quiero anularla por razones obvias.

Probaré un truco de CSS.

De nuevo, eres mejor en eso que yo, pero pensaría que sería posible ocultar el selector de categorías parece que eso no funcionará.

Así que tal vez lo que hay que hacer es hackear el serializador de categorías para que no envíe ninguna categoría. Sin embargo, parece complicado, ya que necesitarías averiguar cómo hackearlo solo cuando estuvieras editando un tema en lugar de crearlo.

1 me gusta

“Hack” funcionó :tada: :

Aún me gustaría una respuesta detallada y sensata del servidor y especialmente una que aprovechara Active Record.

También me encontré con este comportamiento y no sabía qué hacer. Todo mi desarrollo y pruebas son a través de solicitudes de API, ya que aún no tengo nada en el frontend, así que estaba confundido cuando las respuestas que obtuve parecían éxitos. Pensé que mis protecciones simplemente no funcionaban hasta que armé lo mínimo de un depurador y luché a través del paso a paso.

edición:
Vaya… decidí reiniciar completamente mi entorno y comenzó a devolver mensajes de error en la respuesta de la API.