これまでの進行状況の報告:
-
静的な
TopicQueryホワイトリストメソッド(add_custom_param_handlerやextra_options_whitelistなど)が私の Discourse バージョンではクラスメソッドとして利用できないことを確認し、そのアプローチは断念しました。 -
ListController#build_topic_list_optionsにパッチを実装し、TopicQuery.newが呼び出される前に私のカスタムURLパラメータ(例:market_item_statuses、market_price_min)をoptsハッシュにインジェクトしました。 -
この部分は現在正常に動作しています!
/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行自体は示していますが、その詳細なエラーメッセージは含まれていません)。
追記の質問:
これらの状況において、
-
ListControllerのパッチによってTopicQuery.optionsに成功裏にカスタムパラメータが注入されている。 -
これらのカスタムパラメータが
optsに存在するときに500エラーが発生している。 -
そして、この500エラーは、カスタムパラメータを持つリクエストの最初の行にある、最も簡略化されたカスタムフィルターブロック(ただ ログ記録と元のrelationを返すだけのもの)が実行される前に起こる。
-
これはDiscourse
3.5.0.beta3-dev上で発生している。
TopicQuery自体、またはapply_custom_filtersメソッドが、登録済みのカスタムフィルターブロックを呼び出す前にエラーを出す原因は何でしょうか?特に、optionsハッシュにこれらのプラグイン固有のキーが含まれている場合です。以前疑っていたLocalJumpErrorが、シンプルなブロックでも影響している可能性はありますか?
これらの条件下でTopicQueryの挙動で確認すべき次のポイントや、もしこの状況のフルバックトレースを堅牢に取得する方法について、何かアドバイスがあれば非常に助かります。" } }