カスタムトピックフィルタ:URLパラメータが`TopicQuery.options`に到達しない

これまでの進行状況の報告:

  1. 静的な TopicQuery ホワイトリストメソッド(add_custom_param_handler や extra_options_whitelist など)が私の Discourse バージョンではクラスメソッドとして利用できないことを確認し、そのアプローチは断念しました。

  2. ListController#build_topic_list_options にパッチを実装し、TopicQuery.new が呼び出される前に私のカスタムURLパラメータ(例:market_item_statuses、market_price_min)を opts ハッシュにインジェクトしました。

  3. この部分は現在正常に動作しています! /c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Available のようなリクエストを行うと、サーバーログがインジェクションを確認します:

    [TecencMarket_ListControllerExt_BuildOptsV3] 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} TopicQueryから受け取ったOpts: #{opts.inspect}"

    if opts[:market_item_statuses].present?
      Rails.logger.info "#{log_prefix_query} 'market_item_statuses'はoptsに存在します: #{opts[:market_item_statuses]}"
    else
      Rails.logger.info "#{log_prefix_query} 'market_item_statuses'はoptsに存在しません。"
    end
    
    Rails.logger.info "#{log_prefix_query} 元のトピック関係を返します。"
    original_topics_relation # 暗黙的な返り値
  end
  Rails.logger.info "[TecencMarket] 簡略化されたカスタムフィルター(V1.1_Test)を適用しました。"
end

この簡略化されたフィルタの観察結果:

  • カスタムフィルタパラメータを含まないリクエスト(例:/c/market/5/l/latest.json?filter=default のみ):

    • 簡略化されたフィルターブロックのログは正常に出力されます:

      [TecencMarket_SimplifiedFilter_V1.1_Test] TopicQueryに渡されたOpts: {:category=>5, :filter=>"default", ...}
      [TecencMarket_SimplifiedFilter_V1.1_Test] 'market_item_statuses'はoptsに存在しません。
      [TecencMarket_SimplifiedFilter_V1.1_Test] 元のトピック関係を返します。
      
      
    • ページは 200 OK で表示されます。

  • カスタムフィルタパラメータを含むリクエスト(例:/c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Available):

    • ListControllerのパッチログに以下のようなログが出力されます:[TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = Available

    {“type”:“object”,“properties”:{“translation”:"* Completed 500 Internal Server Error in ...msは直後に発生します。

    • 重要なポイントとして、簡略化されたフィルターブロック内から([TecencMarket_SimplifiedFilter_V1.1_Test]...の行はありません)からのログは、この失敗したリクエストについて表示されません。

これは、TopicQueryがoptsハッシュ(現在は私のカスタムパラメータを含む)を使って初期化された後に、discourseのコアのTopicQuery#apply_custom_filtersメカニズムが私の登録した(そして非常にシンプルな)フィルターブロックを実行しようとするときに、500エラーが発生することを示しています。

development.logからの特定のRuby例外と完全なスタックトレースを抽出するのに困難を感じており、これらが「Completed 500…」行の直前にあるはずです(収集したログの断片は500行自体は示していますが、その詳細なエラーメッセージは含まれていません)。

追記の質問:

これらの状況において、

  1. ListControllerのパッチによってTopicQuery.optionsに成功裏にカスタムパラメータが注入されている。

  2. これらのカスタムパラメータがoptsに存在するときに500エラーが発生している。

  3. そして、この500エラーは、カスタムパラメータを持つリクエストの最初の行にある、最も簡略化されたカスタムフィルターブロック(ただ ログ記録と元のrelationを返すだけのもの)が実行される前に起こる。

  4. これはDiscourse 3.5.0.beta3-dev上で発生している。

TopicQuery自体、またはapply_custom_filtersメソッドが、登録済みのカスタムフィルターブロックを呼び出す前にエラーを出す原因は何でしょうか?特に、optionsハッシュにこれらのプラグイン固有のキーが含まれている場合です。以前疑っていたLocalJumpErrorが、シンプルなブロックでも影響している可能性はありますか?

これらの条件下でTopicQueryの挙動で確認すべき次のポイントや、もしこの状況のフルバックトレースを堅牢に取得する方法について、何かアドバイスがあれば非常に助かります。" } }