Bisheriger Fortschrittsbericht:
-
Bestätigt, dass statische
TopicQueryWhitelist-Methoden wieadd_custom_param_handleroderextra_options_whitelistin meiner Discourse-Version nicht als Klassenmethoden verfügbar sind, daher wurden diese Ansätze aufgegeben. -
Ein Patch für
ListController#build_topic_list_optionsimplementiert, um meine benutzerdefinierten URL-Parameter (z. B.market_item_statuses,market_price_min) in dieopts-Hash zu injizieren, bevorTopicQuery.newaufgerufen wird. -
Dieser Teil funktioniert jetzt! Wenn ich eine Anfrage wie
/c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Availablestelle, bestätigen meine Server-Logs die Injektion:[TecencMarket_ListControllerExt_BuildOptsV3] Injekted into opts: market_item_statuses = AvailableSomit erhält
TopicQuery.new(user, opts)jetztopts, die meine benutzerdefinierten Parameter enthalten.
Aktueller Engpass: 500 Fehler & Filter-Block wird nicht erreicht
Trotzdem, dass die Parameter jetzt korrekt an den Initializer von TopicQuery übergeben werden, erhalte ich immer noch einen 500 Internal Server Error, wenn die Anfrage diese benutzerdefinierten Marktparameter enthält.
Um das zu isolieren, habe ich meinen TopicQuery.add_custom_filter(:"tecenc_market_filters")-Block auf das absolut Minimum reduziert.
# plugin.rb - Aktueller vereinfachter benutzerdefinierter Filterblock
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]" # Mein Debug-Prefix
Rails.logger.info "#{log_prefix_query} Opts empfangen von TopicQuery: #{opts.inspect}"
if opts[:market_item_statuses].present?
Rails.logger.info "#{log_prefix_query} 'market_item_statuses' IST VORHANDEN in opts: #{opts[:market_item_statuses]}"
else
Rails.logger.info "#{log_prefix_query} 'market_item_statuses' IST NICHT VORHANDEN in opts."
end
Rails.logger.info "#{log_prefix_query} Rückgabe der ursprünglichen Topics-Relation."
original_topics_relation # Implizite Rückgabe
end
Rails.logger.info "[TecencMarket] Angewandter vereinfachter Filter (V1.1_Test)."
end
Beobachtungen mit diesem vereinfachten Filter:
-
Anfragen ohne meinen benutzerdefinierten Filterparameter (z. B.
/c/market/5/l/latest.json?filter=default):-
Der vereinfachte Filter-Block protokolliert korrekt:
[TecencMarket_SimplifiedFilter_V1.1_Test] Opts empfangen von TopicQuery: {:category=>5, :filter=>"default", ...} [TecencMarket_SimplifiedFilter_V1.1_Test] 'market_item_statuses' IST NICHT VORHANDEN in opts. [TecencMarket_SimplifiedFilter_V1.1_Test] Rückgabe der ursprünglichen Topics-Relation. -
Die Seite lädt mit einem
200 OK.
-
-
Anfragen mit meinem benutzerdefinierten Filterparameter (z. B.
/c/market/5/l/latest.json?filter=defaultmarket_item_statuses=Available):-
Das Log des
ListController-Patches erscheint:[TecencMarket_ListControllerExt_BuildOptsV3] Injected into opts: market_item_statuses = Available -
Ein
Completed 500 Internal Server Error in ...mstritt sofort danach auf. -
Wichtig ist, dass KEINE Logs aus dem vereinfachten Filterblock erscheinen (keine
[TecencMarket_SimplifiedFilter_V1.1_Test]...Zeilen) für diese fehlerhafte Anfrage.
-
Dies deutet darauf hin, dass der 500-Fehler nachdem TopicQuery mit dem opts-Hash initialisiert wird (der jetzt meine benutzerdefinierten Parameter enthält), aber vor oder unmittelbar beim Versuch, das von Discourse zentrale TopicQuery#apply_custom_filters-Verfahren auszuführen, tritt der Fehler auf.
Ich habe Schwierigkeiten, die spezifische Ruby-Ausnahme und den vollständigen Backtrace aus development.log zu isolieren, die unmittelbar vor der Zeile „Completed 500…“ bei den fehlerhaften Anfragen auftreten (die Log-Auszüge, die ich gesammelt habe, zeigen die 500-Zeile selbst, aber nicht die detaillierte Fehlermeldung davor).
Folgefrage:
Angesichts:
-
Dass benutzerdefinierte Parameter erfolgreich in
TopicQuery.optionsdurch denListController-Patch injiziert werden. -
Dass ein 500-Fehler auftritt, wenn diese benutzerdefinierten Parameter in
optsvorhanden sind. -
Dass dieser 500-Fehler vor dem Ausführen eines extrem vereinfachten benutzerdefinierten Filterblocks passiert (der nur protokolliert und die ursprüngliche Relation zurückgibt).
-
Dass dies in Discourse
3.5.0.beta3-devpassiert.
Was könnte dazu führen, dass TopicQuery selbst oder seine Methode apply_custom_filters einen Fehler wirft, noch bevor ein registrierter benutzerdefinierter Filterblock aufgerufen wird, speziell wenn das options-Hash diese plugin-spezifischen Schlüssel enthält? Könnte der vorherige LocalJumpError, den wir vermuteten, noch relevant sein, auch auf einer niedrigeren Ebene, also bei der Handhabung der Iteration oder des Aufrufs der Filterblöcke durch apply_custom_filters, selbst wenn mein vereinfachter Block nur ein implizites return ist?
Jegliche Hinweise darauf, was als Nächstes bei TopicQuery im Umgang mit diesen Arten von benutzerdefinierten Optionen überprüft werden sollte, oder Ratschläge, wie man den vollständigen Backtrace für den 500-Fehler in diesem Szenario möglichst zuverlässig erhält, wären äußerst hilfreich.