Перенаправление существующего маршрута в компоненте темы

Чтобы перенаправить существующий маршрут 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>
8 лайков