ローカルで localhost:5000 に Rails サイトを、localhost:3000 に Discourse サーバーを起動しています。記事(私の場合は Rails リソース)にコメント機能を追加したいと考えており、Discourse の管理パネルで埋め込み可能なホストを設定しました。
Rails のビューに追加したスクリプトスニペットは以下の通りです。
<div id='discourse-comments'></div>
<script type="text/javascript">
DiscourseEmbed = { discourseUrl: 'http://localhost:3000/',
discourseEmbedUrl: '<%= "http://localhost:5000/articles/#{@article.id}" %>' };
(function() {
var d = document.createElement('script'); d.type = 'text/javascript'; d.async = true;
d.src = DiscourseEmbed.discourseUrl + 'javascripts/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')
[0]).appendChild(d);
})();
「Loading Discussion…」というメッセージが表示されるものの、それ以上進みません。問題を追跡した結果、以下のような状況が起きていると考えています。
Sidekiq において、ジョブ Jobs::RetrieveTopic が Jobs::HandledExceptionWrapper: Wrapped FrozenError: can't modify frozen String というエラーで失敗しています。
コードを遡って確認したところ、TopicEmbed.absolutize_url メソッドの 192 行目に原因がありました。
prefix = "#{uri.scheme}://#{uri.host}"
prefix << ":#{uri.port}" if uri.port != 80 && uri.port != 443
私のポートは 5000(80 や 443 ではない)であるため、コードはポート番号を prefix 文字列に連結しようとし、FrozenError が発生します。RetrieveTopic ジョブには # frozen_string_literal: true というプラグマコメントが含まれています。実験としてこれを削除してみましたが、問題は解決しませんでした。Discourse ではデフォルトで全ての文字列リテラルが凍結されているのでしょうか。
ローカル環境で動作させるためのヒントをいただけないでしょうか。また、文字列リテラルが意図的に凍結されているのであれば、これはバグでしょうか。
