Para redirecionar uma rota existente do Discourse em um componente de tema, você pode usar api.modifyClass para modificar a classe da rota.
Mais informações podem ser encontradas na documentação do Ember sobre redirecionamento de rotas. Aqui está um exemplo:
<script type="text/discourse-plugin" version="0.8">
// Modificar a rota de tag.
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
this._super(tag, transition);
// Se for domingo, redirecionar para o tópico com id 20.
if (today.getDay() == 6) {
this.replaceWith("/t/20");
}
}
}
</script>
Se você precisar carregar dados para decidir onde ou se deve redirecionar, é necessário que o gancho da sua rota retorne uma promessa, conforme discutido na documentação do Ember sobre roteamento assíncrono. Aqui está um exemplo:
<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 importar que isso venha primeiro.
this._super(tag, transition);
// Redirecionar para o primeiro tópico aberto que tenha as tags da rota e a tag '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];
// Você precisa considerar o caso em que o destino é o mesmo que a origem.
// Você poderia cancelar a transição, mas aqui permitimos que ela prossiga sem redirecionamento.
if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
context.replaceWith("/t/" + topic.id);
}
}
})
// Capturar quaisquer problemas para que a rota (não redirecionada) possa prosseguir como fallback.
.catch(function() {
console.log('Erro ao carregar tópicos via ajax no gancho afterModel da rota tag show.');
});
},
});
</script>