Discourseプラグイン開発 - パート1 - 基本的なプラグインの作成

Hmmmm. That’s a tricky one, because the symlink needed to be deleted, otherwise the Docker mount fails (as it cannot overwrite the existing file).

I had a bit of a google around for solutions, and found an interesting solution which would dereference the symlink and copy the symlink’s target into the specified directory, but couldn’t find anything that would create a Docker volume mount, thus preserving the dynamic link and bi-directional synchronisation. Happy to be steered towards a solution as this would be a neat feature to have.

Tell me how to add your validation to the app/models /user.rb model?

「いいね!」 1

プラグインファイル (plugin.rb) では、通常の Ruby コードを使用してこれを行うことができます。

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
「いいね!」 6

初めての小さなプラグイン開発を始めました :blush: いくつか質問があるので、誰かお手伝いいただければ幸いです…

最初の質問ですが、このガイドに記載されている方法を使うべきか、それとも本当にプラグインジェネレーターを使うべきでしょうか?

このガイドでは触れられていませんでしたが、plugin.rb ファイルからテンプレートにデータを渡すにはどうすればよいでしょうか?

例えば、プラグインアウトレット topic-above-posts で、誰かがトピックを訪れるたびに、plugin.rb 内の配列からランダムに選ばれた歓迎メッセージを表示したいとします。その場合、そのデータをテンプレートにどのように渡せばよいでしょうか?テンプレートはおそらくここにあると思います:

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs(これで正しいでしょうか?)

何かアドバイスがあれば大変助かります :blush:

「いいね!」 2

プラグインジェネレーターを使用することは、プラグインの構造を理解して始めたい場合に非常に有効な方法です。ぜひおすすめします。

さて、Ruby コードをフロントエンドに組み込む方法についてですが、これらは別々のアプリケーションです。フロントエンド(Ember)は、何らかの形でサーバー(Rails)からデータを取得する必要があります。通常は AJAX 呼び出しで行いますが、SiteSerializer に追加して、フォーラムデータの自動送信の一部として含める方法もあります。

それ以外の場合は、Rails でルートやコントローラーを追加する方法を調べ、メッセージを JSON として送信する手順を確認してください。

「いいね!」 8

ロビン、ありがとう!

これに関するチュートリアルはありますか?あるいは、方向性を示してくれるシンプルなプラグイン(あるいはダミープラグインでも)をご存知でしょうか?(もしなければ、どこかにすぐに掲載していただけませんか?多くの人にとって役立つと思います :blush:

さらに、本を書くことについてのご意見はありますか?もしご興味があれば、誰かをご紹介できますよ :smiley:

「いいね!」 1

褒めていただきありがとうございます。でも、本を書くことを考えるには、どうしても忙しすぎます。それに、技術書は需要が非常に限られています。本を書いたことがある人たちは、お金のためではなく、自分自身のために書くものだと言っています :slight_smile:

サーバー側から何かを返すシンプルなプラグインは思いつきません。discourse-tooltips はルートを追加し、マウスオーバー時にトピックのプレビューを取得するためにそれを使用しています。これが役立つかもしれません。

「いいね!」 8

まもなく、プラグイン開発を開始します……

質問:

実際にプラグインを挿入できる「フック」のリストはありますか?

例えば、投稿に表示される前に「調理済み」データを処理するプラグインを作成したい場合、少なくとも開始時と終了時にフックがあることを期待します。例を挙げると:

  • display_post_start

  • display_post_complex

すると、私たちのプラグインは上記のフック位置のいずれかにフックできます。

これらの「プラグインフック」のリストと、DiscourseWorld におけるこれらの「プラグインフック」の名称は何ですか?

更新:以下を見つけました:

git grep "plugin-outlet" -- "*.hbs"

しかし、調理済みの投稿コンテンツを変更するための outlet は見当たりませんでした。

例えば、投稿の「調理済み」部分を変更するための outlet を作成する方法を解説したチュートリアルはありますか?

「いいね!」 2

このガイド、セクション decorateCooked() をお探しですね:

「いいね!」 5

カスタムプラグインにこのスケルトンを使用しています。今後の Ember 5 への移行にあたり、何か変更する必要はありますか?

おそらく必要ないですよね?これはリンターにすぎませんが?

「いいね!」 1

スケルトンはEmber 5と互換性があります。ただし、JavaScriptコードやhbsテンプレートを追加した場合は、アナウンスに記載されているように非推奨の項目を確認する必要があります。

はい、package.jsonにあるものはリンターに関連するだけで、プラグインの機能や互換性には影響しません。

「いいね!」 3

これに追加してください

rake plugin:create[plugin-name]

今日は Automating Discourse Plugin Setup with `create-discourse-plugin` gem を見つけようとして長時間を費やしました(このrakeタスクの名前を思い出せなかった理由がわかりません! :person_shrugging:

「いいね!」 5

Docker セットアップを使用する際に注意点を追記します。上記の手順では、以下のようなエラーが発生して失敗します。

ambientimpact:~/.../Discourse/discourse$ d/rake plugin:create[neurocracy-date-rewrite]
Cloning 'https://github.com/discourse/discourse-plugin-skeleton' to '/src/plugins/neurocracy-date-rewrite'...
Initializing git repository...
Initialized empty Git repository in /src/plugins/neurocracy-date-rewrite/.git/
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <discourse@localhost>) not allowed
rake aborted!
Command failed with exit 128: git
/src/lib/tasks/plugin.rake:354:in `system'
/src/lib/tasks/plugin.rake:354:in `block (2 levels) in <main>'
/src/lib/tasks/plugin.rake:344:in `chdir'
/src/lib/tasks/plugin.rake:344:in `block in <main>'
Tasks: TOP => plugin:create
(See full trace by running task with --trace)

プラグインを作成しようとする前に、まずコンテナ内に .gitconfig をセットアップする必要があります(必要に応じてメールアドレスと名前を変更してください)。

d/exec git config --global user.email "you@example.com"
d/exec git config --global user.name "Your Name"
d/rake plugin:create[plugin-name]
「いいね!」 1