メール通知テンプレートGUIが%{base_url}でエラーを吐く

3.1.1に2.8.xからアップグレードした後、トピックへのリンクを含めるために%{base_url}%{url}を使用していた古いテンプレートはすべて無効としてハイライトされるようになりました。GUIにはThe following interpolation key is invalid: base_urlと表示されます。

しかし、実際には有効です。削除して%{url}のみを残すとリンクが壊れます(ドメインなしのパスのみが含まれます)。含めると、リンクは有効になり、完全になります。

「いいね!」 1

これはDiscourseの古いバージョンからの変更かもしれませんが、バグではないと思います。メールテンプレートで許可される補間キーを見つけるのは常に難しいことでした。使用できるキーを説明するトピックがあります: https://meta.discourse.org/t/interpolation-keys-for-customizing-text-and-email-templates/264604。許可されるキーはここにリストされています: https://github.com/discourse/discourse/blob/main/app/models/translation_override.rb。

{base_url} はそのリストに含まれていません。

サイトのベースURLはすでにわかっているので、キーが必要かどうかはわかりません。%{base_url}%{url} の代わりに、サイトのURLを使用してください。たとえば https://forum.example.com%{url} のようにしてください。

「いいね!」 2

しかし、それは機能します。つまり、%{base_url} は問題なく展開されるため、無効ではありません(GUI が文句を言うだけです)。さらに、それなしでは完全に機能するリンクを作成できません(完全なベース URL をハードコーディングしない限り。それはダメです)。

プレースホルダーの目的は、一般的に堅牢なソフトウェアを作成することであり、それにはハードコーディングを避けることが含まれます。ドメイン名、ホスト名、または Discourse インストールへのパス(base_url のいずれかの要素)を変更した場合、ハードコーディングしたすべてのテンプレートを編集する必要があります。それは悪いコーディングプラクティスです。

Discourse の開発は非常に健全で堅牢なコーディングプラクティスに従っていることを知っているので、(1) テンプレートを検証するときに base_url を削除したが、(2) 実際に存在する場合は解釈し続け、(3) 悪いコーディングプラクティスに頼ることなく完全に機能する URL を構築する代替手段を提供しなかったのは、見落とし/バグであるとしか考えられません。

また、これは、実際にはメリットが見られない、大きな後方互換性のない変更であり、ユーザーに多くの手作業を強いることになります…バグ/見落としであると考える理由がさらに増えます。

(3.x でテキストテンプレートに関連する他のバグもいくつか見られたので、見落としであると考える理由はさらに増えます)

「いいね!」 1

これをテストしたとき、%{base_url} を保存できず、使用されていませんでした。

おそらく見落としでしょう。古いサイトの既存のメールテンプレートを破損させる可能性があることには同意します。これを Bug カテゴリに戻し、チームにどうするか決定する機会を与えます。

最初に言及したように、3.x にアップグレードした後に無効として誤ってラベル付けされた既存のカスタムテンプレート、つまり 2.x で編集され、アップグレード後も存在する %{base_url} を含むテンプレートについて話しています。そのプレースホルダーを削除すると、URL をハードコーディングすることなく完全な URL を作成することが不可能になります。削除しないと、3.1.1 では問題なく展開されていることが明らかになります。最初の投稿を再読しましたが、不明瞭な点は見つかりませんでした。

おそらく、データベースを直接編集する(または、コードが同じ検証を実行しない場合は Rails コンソールでも)ことで、ご自身でテストできるでしょう。

「いいね!」 2

最終的にそれを理解しました。自分でテストするつもりはありませんが、あなたが正しいことは確かです。

「いいね!」 2

これはバグのように聞こえます。おそらく、%{url} にホスト名が含まれるようにするべきなのでしょう。エンドテンプレートでは、ホスト名のない URL はほとんど役に立ちません(HTML でベース URL をグローバルに変更する方法がない限り)。

チームは今週カンファレンスに参加しているため、この件について意見を述べるには少し時間がかかります。

「いいね!」 1

それは良い習慣だとは思いません。なぜなら、ウェブサイトのルートを参照する方法がなくなるからです。URLを構築できるようにするために、%{base_url} は理由があって重要な役割を果たしています。一般的に、URLのテンプレートシステムは3つのプレースホルダーを提供します:base、path、full_url。ただし、full_urlは便宜上提供されるだけで(最初の2つの連結です)、それ以外は提供されません。

「いいね!」 1

@pfaffman これは3.2.1でもまだ修正されていません。最初の報告から何も変わっていません。修正のために優先度を上げてもらえませんか?要するに、%{url} にはベースURL以降のパスしか含まれないため、ほぼすべてのテンプレートで %{base_url} が許可されるべきです。

少なくとも、ユーザーがそれを使用できないようにしないでください(利用可能なキーのリストに表示されなくても)。

@nordizeさん、ここに返信した人の中にバグ修正の権限を持つ人はいません。

その場合、どうすればいいでしょうか?誰に連絡すればいいのか、あるいは関係者に注意を促すために他にできることがあるのか分かりません。

「いいね!」 1

念のためご報告いたします。エンジニアがこの件の調査に割り当てられました。:+1:

テンプレート内で %{base_url}強制的に 使用するための Rails オブジェクト名または Rails コンソール コマンドについて、どなたか助けていただけますでしょうか(GUI では無効と表示されますが、実際には受け入れて展開されることを確認済みです)。

こんにちは、@nordize さん!

スクリーンショットや、更新しようとしているテンプレートのキーなど、もう少し詳しい情報をいただけますでしょうか。私の環境では base_url を使用しても問題ありませんが、問題は特定のテンプレートに関連している可能性があります。

ここに、存在するべき例があります: Help with Rails console to edit text template

他にもたくさんあります(たとえば、ほとんどのメールテンプレート)。

すべてのメールテンプレート(すべてのテキストテンプレートではないにしても!)は、%{base_url} を許可するはずです。なぜなら、それはどこからでも参照できるウェブサイトのルートだからです。一部のテンプレートから選択的に削除された決定の理由がわかりません…それが何らかの形で見落としであった場合を除き。

「いいね!」 2

ありがとうございます。確認してみます。:+1:

これは意図的なものではないとほぼ確信しています。

「いいね!」 1