La modificación del serializador de categorías se comporta de manera diferente en 2.4.0

Después de actualizar a Release v2.4.0.beta2 · discourse/discourse · GitHub, casi todos nuestros plugins (es decir, vistas previas de listas de temas, eventos, ubicaciones, calificaciones, etc.) han experimentado un problema con el método add_to_serializer en plugin.rb.

El uso existente seguía este formato:

add_to_serializer(:serializer, property) { value }

Esto ya no funciona en un entorno de producción. Todavía funciona en un entorno de desarrollo.

Inicialmente, pensé que podría tener algo que ver con la forma en que se maneja la habilitación de plugins. Como el método _include? de add_to_serializer utiliza el estado enabled?:

if define_include_method
   # No incluir métodos serializados si el plugin está deshabilitado
  klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end

Sin embargo, el uso del sistema enabled_site_setting no parece resolver el problema. Además, enabled? parece seguir teniendo como valor predeterminado true de todos modos:

def enabled?
  @enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end

Para solucionar el problema inmediato, hemos cambiado la forma en que nuestros plugins serializan los datos; sin embargo, me gustaría llegar al fondo de esto si es posible. ¿Alguien tiene alguna idea sobre lo que está sucediendo aquí?

cc @merefield, @fzngagan

Esto es muy inusual, ya que lo utilizamos en las encuestas y definitivamente no están rotas. Lo único que se me ocurre es que estuvieran rotas en la versión beta pero se corrigieron en master. ¿Podrías probar en tests-passed y ver si funcionan?

Lo probaré más a fondo hoy. El uso en las encuestas es ligeramente diferente, ya que el método _include? siempre se invoca con un tercer parámetro false. Sospecho que el método include? podría ser el problema.

add_to_serializer(:post, :polls_votes, false)

Parece que este problema es específico de las modificaciones en los serializadores de categorías.

https://staging.discourse.angusmcleod.com.au tiene un solo plugin instalado: “test-add-to-serializer”

Como puedes ver en plugin.rb, se realizan varias modificaciones en los serializadores.

Las modificaciones en los serializadores que no son de categorías parecen funcionar correctamente, pero las modificaciones en el serializador basic_category solo funcionan en desarrollo.

No encontrarás las propiedades de la categoría de prueba en:

https://staging.discourse.angusmcleod.com.au/categories.json

o

https://staging.discourse.angusmcleod.com.au/c/records-musicians.json

Sin embargo, sí encontrarás las otras propiedades de prueba en:

https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json

o

https://staging.discourse.angusmcleod.com.au/latest.json

Por lo tanto, el problema parece no estar en el método add_to_serializer en sí, sino en la modificación del serializador basic_category.

@j.jaffeux @dan Hola :), parece que han realizado un trabajo reciente en discourse-voting para abordar el mismo problema que he descrito anteriormente.

¿Saben por qué ya no es suficiente agregar propiedades al basic_category_serializer?

Puedo confirmar que esto está afectando a tests-passed

Dan no está disponible, pero esencialmente hay tres lugares diferentes donde serializamos categorías con cantidades variables de datos. Veremos si hay alguna manera de eliminar el mixin aquí, lo cual hace que esto sea más difícil de razonar.

Corregido y retrotraído a las versiones estable y beta.

Dan configuró correctamente la estructura de herencia; el problema es que teníamos un error central muy, muy, muy antiguo.

Gracias @sam, muy apreciado.

Gracias por reportarlo y presionar al respecto. Fue un caso muy, muy complicado de resolver; pasé un tiempo leyendo los internos de Rails para dar con esto.

Asegúrate de revisar la nueva prueba si tienes curiosidad por saber cómo nos aseguramos de que esto funcione bien de ahora en adelante.

Muchas gracias, @sam, por solucionarlo tan rápido.

@angus, ¿nuestro plugin funcionará sin los cambios recientes que hicimos debido a esta corrección?