Un sistema de notificación para rastrear la actividad del usuario en Rails.

Estoy trabajando en una gem que generaría notificaciones basadas en desencadenadores de eventos. Por ejemplo, en un CMS, si se crea un artículo, se generará una notificación “Artículo x creado por el usuario y”. (como las notificaciones de Github / Facebook).

En mi gem, tengo un método has_notifications que cuando se especifica en un modelo, registra las devoluciones de llamada .

El problema, por supuesto, es que cuando se activa la callback, se invoca una acción correspondiente dentro de la gem, pero esta acción requeriría la identificación del usuario que realizó la acción para generar la notificación.

Busqué inspiración en act_as_audited y paper_trail, pero ambos usan la variable Thread.current para almacenar la información del usuario, lo que, por supuesto, creo que es pirata y no es seguro .

En términos de diseño básico, ¿lo estoy haciendo bien? ¿Qué otras opciones tengo para capturar la información del usuario de mi gem? ¿Debería, en cambio, configurar alrededor de los filtros en los respectivos controladores para crear notificaciones, que en caso de que usen el método vainilla current_user?

Cualquier idea sería apreciada. Gracias.

Actualizar

Estoy considerando el uso de atributos virtuales para los modelos con devoluciones de llamada de notificación y establecerlos en los controladores apropiados que usan los filtros anteriores.

Recomendaría imitar el patrón de notificaciones utilizado en Cocoa. Básicamente, podría pasar un diccionario de información de usuario a sus notificaciones para que pueda poner los datos que desea.

Si tengo el presentimiento correcto sobre cómo se debe usar tu gem, creo que el modelo con la callback de notificación probablemente tenga alguna relación con el usuario, ¿verdad?

Luego podría extraer los datos del usuario de la relación, es decir, record.user o record.user_id . Tal vez podría #user forma predeterminada #user y proporcionar y una opción como .has_notification, through: "account" cuando la relación de usuario tiene un nombre diferente.

Si el modelo no tiene ninguna relación, entonces el desarrollador debe transferir el objeto de usuario y proporcionarlo en un método personalizado.