Чтобы перенаправить существующий маршрут Discourse в компоненте темы, вы можете использовать api.modifyClass для модификации класса маршрута.
Дополнительную информацию можно найти в документации Ember по перенаправлению маршрутизации. Вот пример:
<script type="text/discourse-plugin" version="0.8">
// Модифицируем маршрут тега.
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
this._super(tag, transition);
// Если сегодня воскресенье, перенаправляем на тему с id 20.
if (today.getDay() == 6) {
this.replaceWith("/t/20");
}
}
}
</script>
Если вам нужно загрузить данные, чтобы решить, куда или стоит ли перенаправлять, ваш хук маршрута должен возвращать промис, как описано в документации Ember по асинхронной маршрутизации. Вот пример:
<script type="text/discourse-plugin" version="0.8">
const ajax = require('discourse/lib/ajax').ajax;
api.modifyClass('route:tag-show', {
afterModel: function(tag, transition) {
// Похоже, важно, чтобы это было первым.
this._super(tag, transition);
// Перенаправляем на первую открытую тему, помеченную одновременно тегом маршрута и тегом '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];
// Необходимо учесть случай, когда назначение совпадает с источником.
// Можно отменить переход, но здесь мы разрешаем ему продолжиться без перенаправления.
if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
context.replaceWith("/t/" + topic.id);
}
}
})
// Перехватываем любые ошибки, чтобы (не перенаправленный) маршрут мог продолжить работу как запасной вариант.
.catch(function() {
console.log('Ошибка загрузки тем через ajax в хуке afterModel маршрута tag show.');
});
},
});
</script>