Redirigir una ruta existente en un componente theme

Para redirigir una ruta existente de Discourse en un componente de tema, puedes usar api.modifyClass para modificar la clase de la ruta.

Puedes encontrar más información en la documentación de Ember sobre redirección de rutas. Aquí tienes un ejemplo:

<script type="text/discourse-plugin" version="0.8"> 
    // Modificar la ruta de etiqueta.
    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            this._super(tag, transition);
            // Si es domingo, redirigir al tema con id 20.
            if (today.getDay() == 6) {
                this.replaceWith("/t/20");
            }
        }
    });
</script>

Si necesitas cargar datos para decidir dónde o si redirigir, debes hacer que el gancho de tu ruta devuelva una promesa, como se discute en la documentación de Ember sobre enrutamiento asíncrono. Aquí tienes un ejemplo:

<script type="text/discourse-plugin" version="0.8">
    const ajax = require('discourse/lib/ajax').ajax;

    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            // Parece importante que esto venga primero.
            this._super(tag, transition);

            // Redirigir al primer tema abierto etiquetado tanto con la etiqueta de la ruta como con la etiqueta 'canonical'.
            var path = `/tags/intersection/canonical/${tag.id}.json`;
            const context = this;
            return ajax(path).then(function(result){
                var topics = result.topic_list.topics.filter(function(topic) { 
                   return !topic.closed ;
                });
                if (topics && topics.length > 0) {
                    var topic = topics[0];
                    // Debes considerar el caso en que el destino es el mismo que el origen.
                    // Podrías cancelar la transición, pero aquí permitimos que continúe sin redirección.
                    if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
                        context.replaceWith("/t/" + topic.id);
                    }
                }
            })
            // Capturar cualquier problema para que la ruta (sin redirigir) pueda continuar como alternativa.
            .catch(function() {
                console.log('Error al cargar temas mediante ajax en el gancho afterModel de la ruta de visualización de etiqueta.');
            });
        },
    });
</script>
8 Me gusta