ユーザーのプロフィールを表示している際にレンダリングされるテーマコンポーネントを作成しました。これは、私が管理している別の Web サイトに対して AJAX リクエストを送信し、Discourse ユーザーがそこにアカウントを持っているかを確認します(URL に Discourse ユーザー ID を含めて送信します)。もしアカウントがあれば、その Web サイト上のアカウントへのリンクをレンダリングします。
機能はしていますが、Discourse の開発者が見たら気分が悪くなるようなひどいハックだと確信しています。そこで、より良い方法があるかどうかお伺いしたいのです。私は JavaScript と Ruby の開発者ですが、Ember は使ったことがありません(Vue、Backbone、React は使用経験があります)。
<script type="text/discourse-plugin" version="0.8.7">
const {ajax} = require('discourse/lib/ajax')
api.registerConnectorClass('user-profile-primary', 'custom-profile-link', {
setupComponent(args, component) {
args.model.get('fetchPersonnelMember')
}
})
api.modifyClass('model:user', {
fetchPersonnelMember: function () {
console.log('running!', ajax)
const urlTemplate = settings.personnel_lookup_url // e.g. "https://api.29th.org/members?discourse_id=%s"
const url = urlTemplate.replace(/%s/, this.id)
return ajax(url).then((result) => {
if (result.status == true && result.member.id) {
this.setProperties({personnelMember: result.member})
}
})
}.property('id'),
personnelLinkUrl: function () {
if (this.personnelMember) {
const viewUrlTemplate = settings.personnel_view_url // e.g. "https://personnel.29th.org/#members/%s"
return viewUrlTemplate.replace(/%s/, this.personnelMember.id)
}
}.property('personnelMember'),
personnelLinkName: function () {
return this.personnelMember ? this.personnelMember.short_name : ''
}.property('personnelMember')
})
</script>
<script type='text/x-handlebars' data-template-name='/connectors/user-profile-primary/custom-profile-link'>
{{#if model.personnelLinkUrl}}
<div class="public-user-fields">
<div class="public-user-field">
<span class="user-field-name">
{{theme-setting 'personnel_label'}}
</span>
<span class="user-field-value">
<a href="{{{model.personnelLinkUrl}}}">{{model.personnelLinkName}}</a>
</span>
</div>
</div>
{{/if}}
</script>
これは主に (Retired) Use an ID in a custom user field to link to a user's external profile - #24 by LeoMcA から導き出しました。私の推測では、主な問題は非同期関数を実行するために計算プロパティを使用している点です。これは NG です。代わりに、何らかの「読み込み時」フック(ただし、ユーザープロフィールページにいる場合のみ)でその非同期リクエストを実行すべきでしょう。
また、変数のテンプレート形式において、少し車輪の再発明をしているような気もします。理想的には、これを共有可能な設定可能なプラグインにしたいので、設定が https://mysite.com/members/{{id}} のような Handlebars テンプレートのように見えると嬉しいのですが、Discourse のコードベースにはそのようなユーティリティやヘルパーは見当たりませんでした。
ご意見をいただければ幸いです。お時間をいただき、ありがとうございます。