בזמן בניית תוסף עם מסנני רשימת נושאים מותאמים אישית (למשל, לפי מחיר, מיקום) באמצעות פרמטרים של שאילתות URL. ה-URL מתעדכן כראוי (למשל, ...?market_item_statuses=Available), אך הפרמטרים אינם מופיעים ב-topic_query.options בשרת.
הגדרה:
-
רישום פרמטרים בצד הלקוח (tecenc-discovery-params.js):
// tecenc-discovery-params.js
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("1.37.3", (api) =\u003e {
const MARKET_PARAMS_KEYS = [
"market_price_min", "market_price_max", "market_location",
"market_conditions", "market_warranty", "market_item_statuses"
];
MARKET_PARAMS_KEYS.forEach(paramKey =\u003e {
api.addDiscoveryQueryParam(paramKey, { replace: true, refreshModel: true });
});
});
-
ניסיון הלבנה בצד השרת (plugin.rb):
# plugin.rb
module ::Tecenc
MARKET_PARAMS_KEYS = [
:market_price_min, :market_price_max, :market_location,
:market_conditions, :market_warranty, :market_item_statuses
].freeze
end
# after_initialize do
if SiteSetting.tecenc_enabled?
if defined?(::TopicQuery.add_custom_param_handler)
::Tecenc::MARKET_PARAMS_KEYS.each do |param_key|
::TopicQuery.add_custom_param_handler(param_key) { |value| value } # פשוט לצורך קיצור
end
Rails.logger.info "[Tecenc] נרשמנו עם add_custom_param_handler."
elsif defined?(::TopicQuery) \u0026\u0026 ::TopicQuery.methods.include?(:extra_options_whitelist)
current_whitelist = ::TopicQuery.extra_options_whitelist || []
new_whitelist = (current_whitelist + ::Tecenc::MARKET_PARAMS_KEYS).uniq
::TopicQuery.extra_options_whitelist(*new_whitelist)
Rails.logger.info "[Tecenc] הרחבנו את extra_options_whitelist."
else
Rails.logger.warn "[Tecenc]PLUGIN_WARN: לא נמצאה שיטה להלבנת פרמטרים עבור TopicQuery."
end
-
לוגיקת סינון בצד השרת (plugin.rb):
# plugin.rb (בתוך after_initialize / אם מופעל)
::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query|
opts = topic_query.options
Rails.logger.info "[Tecenc_TopicQuery] Opts: #{opts.inspect}" # לוג קריטי
# market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? }
# if market_params_present
# # ... לוגיקת סינון באמצעות opts[key] ...
# end
topics # או modified_topics
end
הבעיה (לוגים):
-
הלבנת פרמטרים נכשלת:
[Tecenc] PLUGIN_WARN: לא נמצאה שיטה מתאימה (add_custom_param_handler או extra_options_whitelist) להלבנת פרמטרים מותאמים אישית עבור TopicQuery.
-
opts ב-TopicQuery.add_custom_filter חסרים את הפרמטרים המותאמים אישית שלנו:
כאשר ה-URL הוא ...?market_item_statuses=Available, הלוג מציג:
[Tecenc_TopicQuery] Opts: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5}
market_item_statuses שלנו (ועוד פרמטרים מותאמים אישית) אינם נוכחים.
הסביבה שלנו:
שאלות:
- מהי הדרך הטובה ביותר כיום להבטיח שפרמטרים של שאילתות URL מותאמים אישית יגיעו ל-
topic_query.options בגרסאות Discourse עדכניות?
- מדוע הניסיונות שלנו להשתמש ב-
add_custom_param_handler או extra_options_whitelist נכשלים עם האזהרה “לא נמצאה שיטה מתאימה”?
- האם יש גישה חלופית לרישום פרמטרים עם
TopicQuery שעלינו להשתמש בה?
כל עזרה תתקבל בברכה רבה!
רק שמתי לב ש-add_custom_param_handler אפילו לא זמין כמתודה ב-TopicQuery. האם יש דרך אחרת לבנות סינונים מותאמים אישית לנושאים בגרסאות הדיסקורס העדכניות?
שיטות ב-TopicQuery: [:add_custom_filter, :apply_custom_filters, :new_filter, :public_valid_options, :remove_custom_filter, :remove_muted_tags, :results_filter_callbacks, :results_filter_callbacks=, :tracked_filter, :unread_filter, :valid_options, :validate?, :validators, :yaml_tag]
{“progress”: "דוח ההתקדמות עד כה:
-
אושר שבשיטות הרשימה הסטטיות 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=defaultmarket_item_statuses=Available, היומנים בשרת מאשרים את ההכנסה:
[TecencMarket_ListControllerExt_BuildOptsV3] הוכנס ל-opts: market_item_statuses = Available
לכן, TopicQuery.new(user, opts) מקבל כעת את opts הכולל את הפרמטרים המותאמים שלי.
נקודת תקיעות נוכחית: שגיאת 500 וחסימת הפילטר
למרות שהפרמטרים מעוברים כראוי ל-TopicQuery ב-Iinitialiser, עדיין אני מקבל שגיאת 500 פנימית בשרת כאשר הבקשה כוללת את פרמטרי השוק המותאמים.
לבודד את הבעיה, הפשטתי את בלוק ה-add_custom_filter(:"tecenc_market_filters") ל-Minimum.
# 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]" # קידומת ניהול debug שלי
Rails.logger.info "#{log_prefix_query} ה-Opts שהתקבלו מ-TopicQuery: #{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
הערות עם הפילטר הפשוט הזה:
זה מציין שהשגיאה 500 מתרחשת אחרי ש-TopicQuery מאותחל עם מערך ההגדרות opts (שכעת מכיל את הפרמטרים ההתאמיים שלי), אבל לפני או בדיוק כאשר מנגנון TopicQuery#apply_custom_filters של Discourse מנסה להריץ את בלוק הפילטר שהרשמתי (ונראה פשוט מאוד עכשיו).
אני נתקל בקושי לבודד את החריג Ruby המדויק ואת תצוגת מחזיר הקריאות המלאה מתוך development.log שקודמים ישירות לשורה “Completed 500…” עבור הבקשות הכושלות (הקטעים שהאספתי מראים את שורת 500 עצמה, אך לא את הודעת השגיאה המפורטת שלפניה).
שאלה המשך:
בהינתן ש:
-
פרמטרים מותאמים אישית מוזרמים בהצלחה ל-TopicQuery.options באמצעות פאץ’ ListController.
-
שגיאת 500 מתרחשת כאשר פרמטרים אלה קיימים ב-opts.
-
השגיאה 500 מתרחשת לפני שהבלוק הפילטר המותאם מאוד (שפשוט לוג ומחזיר את היחס ההתחלתי) מתבצע בכלל.
-
זה על Discourse 3.5.0.beta3-dev.
מה עלול לגרום ל-TopicQuery או ל-apply_custom_filters שלה להשמיט שגיאה לפני קריאת הבלוק המותאם באופן ספציפי כאשר במילון options קיימות מפתחות של תוסף כזה או אחר? האם הבעיה הקודמת של LocalJumpError שהשערנו עדיין רלוונטית ברמה נמוכה יותר בעניין טיפול בלולאת קריאות או קריאה של בלוקי מסנן, גם אם הבלוק הפשטני שלי הוא פשוט החזרה אוטומטית?
כל הכוונה על מה לבדוק בהמשך בהתנהגות של TopicQuery עם סוגי אפשרויות מותאמות אישית, או עצות כיצד להשיג תצוגת מחזיר הקריאות המלאה באופן אמין יותר לשגיאת ה-500 במצב זה, יהיו לעזר רב.