# Пользовательские фильтры тем: параметры URL не доходят до \`TopicQuery.options\`

**URL:** <https://meta.discourse.org/t/custom-topic-filters-url-params-not-reaching-topicquery-options/367291>\
**Category:** Development\
**Created:** [22.Май.2025 21:05:46 UTC](https://meta.discourse.org/t/custom-topic-filters-url-params-not-reaching-topicquery-options/367291 "2025-05-22T21:05:46Z")\
**Posts on this page:** 1\
**Showing post:** 3

<div class="post-metadata">

**Author:** ![SubStrider](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/substrider/32/512604_2.png) [@SubStrider](https://meta.discourse.org/u/SubStrider)\
**Post date:** [23.Май.2025 11:51:16 UTC](https://meta.discourse.org/t/custom-topic-filters-url-params-not-reaching-topicquery-options/367291/3 "2025-05-23T11:51:16Z")

</div>

**Отчет о прогрессе на данный момент:**

1. Подтверждено, что статические методы белых списков `TopicQuery`, такие как `add_custom_param_handler` или `extra_options_whitelist`, недоступны как методы класса в моей версии Discourse, поэтому от этих подходов пришлось отказаться.

2. Внедрена патч-заплатка для `ListController#build_topic_list_options`, чтобы инжектировать мои пользовательские параметры URL (например, `market_item_statuses`, `market_price_min`) в хэш `opts` перед вызовом `TopicQuery.new`.

3. **Эта часть теперь работает!** Когда я делаю запрос вроде `/c/market/5/l/latest.json?filter=default&market_item_statuses=Available`, логи моего сервера подтверждают инжекцию:

**Текущее препятствие: ошибка 500 и блок фильтра не вызывается**

Несмотря на то, что параметры теперь корректно передаются в инициализатор `TopicQuery`, я все еще получаю **ошибку 500 Internal Server Error** , когда запрос включает эти пользовательские параметры рынка.

Чтобы изолировать проблему, я упростил блок `TopicQuery.add_custom_filter(:"tecenc_market_filters")` до абсолютного минимума.

```ruby
# 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`):

- **Запросы _с_ моим пользовательским параметром фильтра** (например, `/c/market/5/l/latest.json?filter=default&market_item_statuses=Available`):

Это указывает на то, что ошибка 500 возникает _после_ инициализации `TopicQuery` с хэшем `opts` (который теперь содержит мои пользовательские параметры), но _до_ или _в момент_, когда основной механизм Discourse `TopicQuery#apply_custom_filters` пытается выполнить мой зарегистрированный (и теперь крайне простой) блок фильтра.

Мне трудно изолировать конкретное исключение Ruby и полный стек вызовов из `development.log`, которые предшествуют строке «Completed 500…» для неудачных запросов (собранные мной фрагменты логов показывают саму строку 500, но не детальное сообщение об ошибке сразу перед ней).

**Дополнительный вопрос:**

Учитывая, что:

1. Пользовательские параметры теперь успешно инжектируются в `TopicQuery.options` патчем `ListController`.

2. Ошибка 500 возникает, когда эти пользовательские параметры присутствуют в `opts`.

3. Эта ошибка 500 происходит _до_ того, как даже крайне упрощенный блок пользовательского фильтра (который только логирует и возвращает исходное отношение) успевает выполнить первую строку своего кода для запроса с пользовательскими параметрами.

4. Это происходит на версии Discourse `3.5.0.beta3-dev`.

Что может вызывать ошибку в самом `TopicQuery` или в его методе `apply_custom_filters` перед вызовом зарегистрированного блока пользовательского фильтра, особенно когда хэш `options` содержит эти специфичные для плагина ключи? Может ли ранее подозреваемая `LocalJumpError` все еще быть актуальной на более низком уровне, в том, как `apply_custom_filters` обрабатывает итерацию или вызов блоков фильтров, даже если мой упрощенный блок просто содержит неявный возврат?

Любые рекомендации о том, что проверить дальше в поведении `TopicQuery` с такими пользовательскими опциями, или советы, как надежно получить полный стек вызовов для ошибки 500 в этой ситуации, были бы чрезвычайно полезны.

---

_[View the full topic](https://meta.discourse.org/t/custom-topic-filters-url-params-not-reaching-topicquery-options/367291)._
