# Встраивание виджета комментариев на localhost вызывает FrozenError

**URL:** https://meta.discourse.org/t/embedding-comments-widget-on-localhost-causes-frozenerror/151722
**Category:** Support
**Created:** [16.Май.2020 22:12:59 UTC](https://meta.discourse.org/t/embedding-comments-widget-on-localhost-causes-frozenerror/151722 "2020-05-16T22:12:59Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![Dev\_Singh](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/dev_singh/32/163779_2.png) [@Dev\_Singh](https://meta.discourse.org/u/Dev_Singh)
#### Post date: [16.Май.2020 22:12:59 UTC](https://meta.discourse.org/t/embedding-comments-widget-on-localhost-causes-frozenerror/151722/1 "2020-05-16T22:12:59Z")

</div>

У меня есть сайт на Rails, работающий на `localhost:5000`, и локальный сервер Discourse запущен на `localhost:3000`. Я хочу включить комментарии к статьям (в моем случае это ресурс Rails), поэтому в панели администратора Discourse настроил хост для встраивания:

 ![Screen Shot 2020-05-16 at 2.56.33 PM](https://global.discourse-cdn.com/meta/original/3X/b/b/bb560230f46cc6988ccd0b6d101c7f5fac4c5d84.png)

Вот фрагмент скрипта, который я добавил в представление 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.

Есть ли какие-то советы, как заставить это работать локально? Также, если строковые литералы действительно должны быть заморожены, является ли это ошибкой?

---

<div class="post-metadata">

### Author: ![codinghorror](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/codinghorror/32/110067_2.png) [@codinghorror](https://meta.discourse.org/u/codinghorror)
#### Post date: [16.Май.2020 23:10:33 UTC](https://meta.discourse.org/t/embedding-comments-widget-on-localhost-causes-frozenerror/151722/2 "2020-05-16T23:10:33Z")

</div>

Discourse **не поддерживает** работу на нестандартных портах.
