プラグインで.erbテンプレートを使う

最近、Discourse で .erb テンプレートの操作に関するアドバイスをいくつか提供してきましたが、meta にはこれに関する詳細があまりないことに気づいたので、この件に関する wiki を開始することにしました。この wiki は、.erb テンプレートが何であるか、そしてそれが Discourse およびより広範な Rails における機能であるかを理解していることを前提としています。その背景についてさらに詳しい情報が必要な場合は、まずこちらをお読みください。

サーバープラグインのアウトレット

サーバープラグインのアウトレットは、クライアントプラグインのアウトレットと同様の方法で機能しますが、数はそれほど多くありません。これらを使用すると、独自の .erb テンプレートを discourse/discourse .erb テンプレートに挿入できます。定義は次のようになります。

<%= server_plugin_outlet [name] %>

例として、チャットプラグインの unsubscribe_options アウトレットの使用をご覧ください。

HTML ビルダー

HTML ビルダーは、テンプレートやプラグインアウトレットを使用するのではなく、動的に構築される標準的な HTML 用に設計されています。.erb テンプレートで HTML ビルダーを使用するには、これらの挿入ポイントを探します。

<%= build_plugin_html [name] %>

これらのポイントに HTML を挿入するには、plugin.rbregister_html_builder ブロックに返す必要があります。たとえば、次のようになります。

register_html_builder([name]) do |controller|
   ## カスタム HTML を構築して返します
end

例として、solved プラグインの server:before-head-close-crawler の使用をご覧ください。

クライアント側の HTML を追加するために HTML ビルダーを登録することもできますが、これは推奨されません。クライアント側の HTML は、クライアント側のプラグインアウトレットとテンプレートを使用して追加してください。

同様に、register_custom_html というサーバー側のプラグイン API メソッドもあります。これは同様の目的で使用できますが、特別な理由がない限り、また、何をしているか理解している場合を除き、使用しないことをお勧めします。

テンプレートのオーバーライド

プラグインの .erb テンプレートは、プラグインのビューをコントローラーの view_paths に追加することでオーバーライドできます。これは単なる Rails の機能であり、Discourse 固有ではありません。この機能の仕組みについては、Rails ガイドのこちらで説明されています。

たとえば、app/views/email/unsubscribed.html.erb をオーバーライドしたい場合は、次の 2 つの作業を行う必要があります。

プラグインビューを同じ名前空間を使用して構造化する

テンプレートはここに配置する必要があります。

your-plugin-folder/app/views/email/unsubscribed.html.erb

プラグインビューパスを関連するコントローラーの前に挿入する

この場合、関連するコントローラーは EmailController です。plugin.rb ファイルに次を追加します。

EmailController.prepend_view_path File.expand_path("../views", __FILE__)

ほとんどの場合、プラグインのビューをグローバルなビューパスに追加することもできますが、その必要はありません。

「いいね!」 8