Отчет о прогрессе на данный момент:
-
Подтверждено, что статические методы белых списков
TopicQuery, такие какadd_custom_param_handlerилиextra_options_whitelist, недоступны как методы класса в моей версии Discourse, поэтому от этих подходов пришлось отказаться. -
Внедрена патч-заплатка для
ListController#build_topic_list_options, чтобы инжектировать мои пользовательские параметры URL (например,market_item_statuses,market_price_min) в хэшoptsперед вызовомTopicQuery.new. -
Эта часть теперь работает! Когда я делаю запрос вроде
/c/market/5/l/latest.json?filter=default&market_item_statuses=Available, логи моего сервера подтверждают инжекцию:[TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = AvailableТаким образом,
TopicQuery.new(user, opts)теперь получаетopts, содержащий мои пользовательские параметры.
Текущее препятствие: ошибка 500 и блок фильтра не вызывается
Несмотря на то, что параметры теперь корректно передаются в инициализатор TopicQuery, я все еще получаю ошибку 500 Internal Server Error, когда запрос включает эти пользовательские параметры рынка.
Чтобы изолировать проблему, я упростил блок TopicQuery.add_custom_filter(:"tecenc_market_filters") до абсолютного минимума.
# plugin.rb - Текущий упрощенный блок пользовательского фильтра
if ::TopicQuery.respond_to?(:add_custom_filter)
::TopicQuery.add_custom_filter(:"tecenc_market_filters") do |topics, topic_query|
original_topics_relation = topics
opts = topic_query.options
log_prefix_query = "[TecencMarket_SimplifiedFilter_V1.1_Test]" # Мой отладочный префикс
Rails.logger.info "#{log_prefix_query} Opts received by TopicQuery: #{opts.inspect}"
if opts[:market_item_statuses].present?
Rails.logger.info "#{log_prefix_query} 'market_item_statuses' IS PRESENT in opts: #{opts[:market_item_statuses]}"
else
Rails.logger.info "#{log_prefix_query} 'market_item_statuses' IS NOT PRESENT in opts."
end
Rails.logger.info "#{log_prefix_query} Returning original topics relation."
original_topics_relation # Неявный возврат
end
Rails.logger.info "[TecencMarket] Applied SIMPLIFIED custom filter (V1.1_Test)."
end
Наблюдения с этим упрощенным фильтром:
-
Запросы без моего пользовательского параметра фильтра (например, просто
/c/market/5/l/latest.json?filter=default):-
Блок упрощенного фильтра логируется корректно:
[TecencMarket_SimplifiedFilter_V1.1_Test] Opts received by TopicQuery: {:category=>5, :filter=>"default", ...} [TecencMarket_SimplifiedFilter_V1.1_Test] 'market_item_statuses' IS NOT PRESENT in opts. [TecencMarket_SimplifiedFilter_V1.1_Test] Returning original topics relation. -
Страница загружается с кодом
200 OK.
-
-
Запросы с моим пользовательским параметром фильтра (например,
/c/market/5/l/latest.json?filter=default&market_item_statuses=Available):-
Появляется лог патча
ListController:[TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = Available -
Сразу после этого происходит
Completed 500 Internal Server Error in ...ms. -
Критически важно: в логах для этого неудачного запроса НЕТ записей изнутри упрощенного блока фильтра (нет строк вида
[TecencMarket_SimplifiedFilter_V1.1_Test]...).
-
Это указывает на то, что ошибка 500 возникает после инициализации TopicQuery с хэшем opts (который теперь содержит мои пользовательские параметры), но до или в момент, когда основной механизм Discourse TopicQuery#apply_custom_filters пытается выполнить мой зарегистрированный (и теперь крайне простой) блок фильтра.
Мне трудно изолировать конкретное исключение Ruby и полный стек вызовов из development.log, которые предшествуют строке «Completed 500…» для неудачных запросов (собранные мной фрагменты логов показывают саму строку 500, но не детальное сообщение об ошибке сразу перед ней).
Дополнительный вопрос:
Учитывая, что:
-
Пользовательские параметры теперь успешно инжектируются в
TopicQuery.optionsпатчемListController. -
Ошибка 500 возникает, когда эти пользовательские параметры присутствуют в
opts. -
Эта ошибка 500 происходит до того, как даже крайне упрощенный блок пользовательского фильтра (который только логирует и возвращает исходное отношение) успевает выполнить первую строку своего кода для запроса с пользовательскими параметрами.
-
Это происходит на версии Discourse
3.5.0.beta3-dev.
Что может вызывать ошибку в самом TopicQuery или в его методе apply_custom_filters перед вызовом зарегистрированного блока пользовательского фильтра, особенно когда хэш options содержит эти специфичные для плагина ключи? Может ли ранее подозреваемая LocalJumpError все еще быть актуальной на более низком уровне, в том, как apply_custom_filters обрабатывает итерацию или вызов блоков фильтров, даже если мой упрощенный блок просто содержит неявный возврат?
Любые рекомендации о том, что проверить дальше в поведении TopicQuery с такими пользовательскими опциями, или советы, как надежно получить полный стек вызовов для ошибки 500 в этой ситуации, были бы чрезвычайно полезны.