لإعادة توجيه مسار 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);
// إذا كان اليوم أحد، أعد التوجيه إلى الموضوع ذي المعرف 20.
if (today.getDay() == 6) {
this.replaceWith("/t/20");
}
}
});
</script>
إذا كنت بحاجة إلى تحميل بيانات لتحديد مكان أو ما إذا كان سيتم إعادة التوجيه، فيجب أن يقوم خطاف المسار بإرجاع وعد (promise)، كما هو موضح في توثيق 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('Error loading topics by ajax in tag show route afterModel hook.');
});
},
});
</script>