Mientras construye un plugin con filtros de lista de temas personalizados (por ejemplo, por precio, ubicación) usando parámetros de consulta en la URL. La URL se actualiza correctamente (por ejemplo, ...?market_item_statuses=Available), pero los parámetros no aparecen en topic_query.options en el servidor.
Configuración:
-
Registro de parámetros en el lado del cliente (
tecenc-discovery-params.js):// tecenc-discovery-params.js import { apiInitializer } from "discourse/lib/api"; export default apiInitializer("1.37.3", (api) => { const MARKET_PARAMS_KEYS = [ "market_price_min", "market_price_max", "market_location", "market_conditions", "market_warranty", "market_item_statuses" ]; MARKET_PARAMS_KEYS.forEach(paramKey => { api.addDiscoveryQueryParam(paramKey, { replace: true, refreshModel: true }); }); }); -
Intento de inclusión en el lado del servidor (
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 } # Simplificado para brevedad end Rails.logger.info "[Tecenc] Registrado con add_custom_param_handler." elsif defined?(::TopicQuery) && ::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] Ampliado el whitelist de opciones adicionales." else Rails.logger.warn "[Tecenc] ADVERTENCIA DEL PLUGIN: No se pudo encontrar un método para incluir en la lista blanca los parámetros para TopicQuery." end -
Lógica de filtrado en el lado del servidor (
plugin.rb):# plugin.rb (dentro de after_initialize / si está habilitado) ::TopicQuery.add_custom_filter(:"tecenc_filters") do |topics, topic_query| opts = topic_query.options Rails.logger.info "[Tecenc_TopicQuery] Opciones: #{opts.inspect}" # LOG CRÍTICO # market_params_present = ::Tecenc::MARKET_PARAMS_KEYS.any? { |p| opts[p].present? } # if market_params_present # # ... lógica de filtrado usando opts[key] ... # end topics # o topics filtrados end
El problema (Registros):
-
Fallo en la inclusión de listas blancas de parámetros:
[Tecenc] PLUGIN_WARN: No se pudo encontrar un método adecuado (add_custom_param_handler o extra_options_whitelist) para incluir en la lista blanca los parámetros personalizados para TopicQuery. -
optsenTopicQuery.add_custom_filterno contiene nuestros parámetros personalizados:
Cuando la URL es...?market_item_statuses=Available, la log muestra:[Tecenc_TopicQuery] Opciones: {:category=>5, :filter=>"default", :topic_ids=>nil, :category_id=>5}
Nuestros market_item_statuses (y otros parámetros personalizados) no están presentes.
Nuestro entorno:
Preguntas:
- ¿Cuál es la mejor práctica actual para garantizar que los parámetros personalizados en la URL lleguen a
topic_query.optionsen versiones recientes de Discourse? - ¿Por qué podrían estar fallando nuestros intentos de usar
add_custom_param_handleroextra_options_whitelistcon la advertencia “No se pudo encontrar un método adecuado”? - ¿Existe un enfoque alternativo para el registro de parámetros con
TopicQueryque deberíamos usar?
¡Cualquier ayuda será muy apreciada!