מסנני נושאים מותאמים: פרמטרי URL אינם מגיעים ל-`TopicQuery.options`

{“progress”: "דוח ההתקדמות עד כה:

  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=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

הערות עם הפילטר הפשוט הזה:

  • בקשות בלי פרמטר הפילטר המותאם שלי (למשל /c/market/5/l/latest.json?filter=default):

    • הלוג של הפילטר הפשוט מתרחש כראוי:

      [TecencMarket_SimplifiedFilter_V1.1_Test] ה-Opts שהתקבלו מ-TopicQuery: {: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] הוכנס ל-opts: market_item_statuses = Available

    • שגיאת Completed 500 Internal Server Error in ...ms מתרחשת מייד לאחר מכן.

    • באופן קריטי, אין לוגים מתוך בלוק הפילטר המפושט (אין שורות [TecencMarket_SimplifiedFilter_V1.1_Test]...) שמופיעות עבור בקשת הכישלון הזו.

זה מציין שהשגיאה 500 מתרחשת אחרי ש-TopicQuery מאותחל עם מערך ההגדרות opts (שכעת מכיל את הפרמטרים ההתאמיים שלי), אבל לפני או בדיוק כאשר מנגנון TopicQuery#apply_custom_filters של Discourse מנסה להריץ את בלוק הפילטר שהרשמתי (ונראה פשוט מאוד עכשיו).

אני נתקל בקושי לבודד את החריג 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 שהשערנו עדיין רלוונטית ברמה נמוכה יותר בעניין טיפול בלולאת קריאות או קריאה של בלוקי מסנן, גם אם הבלוק הפשטני שלי הוא פשוט החזרה אוטומטית?

כל הכוונה על מה לבדוק בהמשך בהתנהגות של TopicQuery עם סוגי אפשרויות מותאמות אישית, או עצות כיצד להשיג תצוגת מחזיר הקריאות המלאה באופן אמין יותר לשגיאת ה-500 במצב זה, יהיו לעזר רב.