Ошибка с категориями с ограниченной видимостью и/или подкатегориями

У меня тоже самое, и я обновился сегодня. Значит, это в Discourse?

А теперь я попробую копнуть чуть глубже.

1 лайк

Хм, у вас ошибка на стороне сервера, @Jagster, думаю, это совсем другое. Кроме того, это изменение ещё не слито, поэтому оно не должно влиять на сайты с самостоятельным размещением.

Это правда, но я был в системе. Ошибка OP относится к анонимным пользователям. В любом случае, в обоих случаях это происходит с категориями.

Из Discourse:

HasCustomFields::NotPreloadedError (Попытка доступа к не предзагруженному пользовательскому полю 'sort_topics_by_event_start_date' в классе 'Category'.

И

Сообщение

HasCustomFields::NotPreloadedError (Попытка доступа к не предзагруженному пользовательскому полю 'sort_topics_by_event_start_date' в классе 'Category'. Это запрещено для предотвращения N+1 запросов.)
app/models/concerns/has_custom_fields.rb:203:in `[]'
(eval):47:in `_fast_attributes'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
app/controllers/application_controller.rb:531:in `serialize_data'
app/controllers/application_controller.rb:540:in `render_serialized'
app/controllers/categories_controller.rb:408:in `categories_and_topics'
app/controllers/categories_controller.rb:99:in `categories_and_latest'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'

Обратная трассировка

app/models/concerns/has_custom_fields.rb:203:in `[]'
plugins/discourse-calendar/plugin.rb:88:in `block (2 levels) in activate!'
(eval):47:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:456:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:124:in `block in serialize'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `map'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `serialize'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'

Итак… дальше я удалю плагин календаря, верно?

редактирование

Ссылки на категории в боковой панели работают отлично, все остальные ссылки на категории вызывают ошибку.

Я немного сузил область этой ошибки. Она возникает только тогда, когда у категории есть подкатегории. Кроме того, /categories также возвращает ошибку 500.

И я всё ещё не уверен, связана ли она с Calender. Если да, то это ещё один случай, когда безопасный режим (safe-mode) бессилен?

Однако Lockdown выдаёт следующее:

Message

HasCustomFields::NotPreloadedError (Attempted to access the non preloaded custom field 'redirect_url' on the 'Category' class. This is disallowed to prevent N+1 queries.)
app/models/concerns/has_custom_fields.rb:203:in `[]'
(eval):49:in `_fast_attributes'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
app/controllers/application_controller.rb:531:in `serialize_data'
app/controllers/application_controller.rb:540:in `render_serialized'
app/controllers/categories_controller.rb:408:in `categories_and_topics'
app/controllers/categories_controller.rb:99:in `categories_and_latest'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'

Backtrace

app/models/concerns/has_custom_fields.rb:203:in `[]'
plugins/discourse-category-lockdown/plugin.rb:18:in `block (2 levels) in activate!'
(eval):49:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:468:in `rescue in attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:455:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:124:in `block in serialize'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `map'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `serialize'

Env

HTTP HOSTS: foorumi.katiska.eu

Поэтому я почти уверен, что проблема не в плагинах, а в самом Discourse, но, опять же, я не разработчик.

Я автор темы (OP), и у меня не установлен плагин «Календарь» (я использую размещённую версию Discourse, где этот плагин недоступен).

Возможно, дело в том, что «подкатегории вызывают это»… Сейчас я не могу точно сказать, так как на моём сайте сейчас всё работает со сбоями. Но я только что создал категорию… Так что если (я забыл, как это работает) по умолчанию новые категории создаются, например, внутри «Публичной», то я действительно только что создал свою первую подкатегорию (случайно).

Ошибка, безусловно, выглядит так, будто исходит… sort_topics_by_event_start_date

Это регистрируется здесь:

а для категорий здесь:

У меня есть ощущение, что это может быть регрессия из-за работы над масштабируемостью категорий, которую мы сейчас проводим… мы посмотрим.

1 лайк

Круто! Это уже было сообщено. Я оставлю это ниже, чтобы поиск работал лучше.

при попытке загрузить /categories.json)

Мы расследуем это.

Эта проблема вызвана плагином discourse-calendar, но её должен исправить его последняя версия (скоро):

Это проблема плагинов discourse-category-lockdown, над которыми мы не имеем контроля. Однако я могу отправить для него PR.

6 лайков

Дальнейшее отслеживание проблемы здесь non preloaded custom field - Discourse Category Lockdown - Pavilion

1 лайк

Из-за чего? То есть, оба плагина столкнулись с одной и той же ошибкой по причине X, или в Discourse что-то изменилось, что повлияло на оба?

Нет, я ни на кого не сваливаю вину, я просто пытаюсь понять терминологию.

Это вызвано недавним улучшением производительности. Пользовательские поля — это уникальная особенность нашей кодовой базы, которую могут использовать различные плагины для расширения функциональности. Однако при неправильном использовании это может привести к снижению производительности. Данное улучшение направлено на решение этой проблемы:

1 лайк

Я отправил PR по этому вопросу здесь, но это репозиторий, к которому у нас нет доступа:

6 лайков

Я увидел, что это было слито, я пересобрал проект, и проблема исправилась :tada: Спасибо за быстрое исправление, как всегда оперативно.

1 лайк

Да. Работает отлично. Большое спасибо.

Хотя «Блокировка категорий» вызывает вечный спиннер (хотя, возможно, эта проблема возникает и в режиме приватного просмотра Firefox/iPad). Но это другая проблема, полагаю.

1 лайк