У меня есть сайт на Rails, работающий на localhost:5000, и локальный сервер Discourse запущен на localhost:3000. Я хочу включить комментарии к статьям (в моем случае это ресурс 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);
})();
Я вижу сообщение «Загрузка обсуждения…», но ничего больше не происходит. Я попытался отследить проблему и думаю, что происходит следующее.
В Sidekiq задача Jobs::RetrieveTopic завершается ошибкой с сообщением Jobs::HandledExceptionWrapper: Wrapped FrozenError: can't modify frozen String.
Отследив проблему в коде, я дошел до строки 192 в методе TopicEmbed.absolutize_url:
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.
Есть ли какие-то советы, как заставить это работать локально? Также, если строковые литералы действительно должны быть заморожены, является ли это ошибкой?
