زر الموافقة في ملف المستخدم لا يعمل

متابعة للنقاش من الإشعار يدّعي وجود مستخدمين X للموافقة، لكن لا يُعثر على أي منهم:

لقد قمت مؤخرًا بتفعيل خيار require_approval في منتداي مرة أخرى. وعلى الفور، تلقيت إشعارات بشأن مستخدم في انتظار الموافقة، ولكن عند النقر على الرابط في الرسالة، لم أجد أي مستخدم في قائمة المراجعة. ومنذ ذلك الحين، أتلّق هذا الإشعار كل 7 أيام. لذا، استخدمت مستكشف البيانات للبحث عن المستخدم الذي لم يتم الموافقة عليه لكنه لا يظهر في قائمة المراجعة.

خطوات أكثر تفصيلاً مستقاة من الموضوع الآخر

لذا، عندما أنظر إلى صفحة إدارة المستخدمين، أجد زر الموافقة المتوقع. والمشكلة هي أنه لا يعمل. لا توجد أي تغذية راجعة مرئية مثل نافذة منبثقة تعرض خطأً. لكن يوجد خطأ في وحدة تحكم المتصفح

خطأ في وحدة تحكم المتصفح
ajax.js:233  PUT https://my-forum.discourse.group/admin/users/123/approve 500 (Internal Server Error)
send @ jquery.js:9940
ajax @ jquery.js:9521
performAjax @ ajax.js:233
(anonymous) @ ajax.js:246
approve @ admin-user.js:220
approve @ index.js:224
(anonymous) @ d-button.gjs:206
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gjs:203
click @ d-button.gjs:161


/admin/users/123/anon84265489:1 Uncaught (in promise) {jqXHR: {…}, textStatus: 'error', errorThrown: ''}errorThrown: ""jqXHR: abort: ƒ (e)always: ƒ ()catch: ƒ (e)done: ƒ ()fail: ƒ ()getAllResponseHeaders: ƒ ()getResponseHeader: ƒ (e)jqTextStatus: "error"overrideMimeType: ƒ (e)pipe: ƒ ()progress: ƒ ()promise: ƒ (e)readyState: 4requestedUrl: "/admin/users/123/approve"responseText: "<!DOCTYPE html>\n<html>\n<head>\n  <title>أوبس - خطأ 500</title>\n  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n</head>\n<body>\n    <h1>أوبس</h1>\n    <p>واجهت البرمجيات التي تشغل هذا المنتدى مشكلة غير متوقعة. نعتذر عن الإزعاج.</p>\n    <p>تم تسجيل معلومات مفصلة حول الخطأ، وتم إنشاء إشعار تلقائي. سنقوم بالنظر في الأمر.</p>\n    <p>لا حاجة لاتخاذ أي إجراء إضافي. ومع ذلك، إذا استمرت حالة الخطأ، يمكنك تقديم تفاصيل إضافية، بما في ذلك خطوات تكرار الخطأ، عن طريق نشر موضوع نقاش في فئة التغذية الراجعة للموقع.</p>\n</body>\n</html>\n"setRequestHeader: ƒ (e,t)state: ƒ ()status: 500statusCode: ƒ (e)statusText: "error"then: ƒ (e,i,n)[[Prototype]]: ObjecttextStatus: "error"[[Prototype]]: Object
Promise.then
approve @ admin-user.js:222
approve @ index.js:224
(anonymous) @ d-button.gjs:206
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gjs:203
click @ d-button.gjs:161

لذا، في الخطوة التالية، تحققت من /logs:

خطأ في /logs
رسالة (تم الإبلاغ عن 14 نسخة)

Reviewable::InvalidAction (لا يمكن تنفيذ `approve_user` على ReviewableUser)
app/models/reviewable.rb:860:in 'Reviewable#validate_action!'
app/models/reviewable.rb:360:in 'Reviewable#perform'
app/controllers/admin/users_controller.rb:306:in 'Admin::UsersController#approve'
app/controllers/application_controller.rb:452:in 'block in ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:452:in 'ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:1101:in 'ApplicationController#ensure_dont_cache_page'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:417:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:12:in 'Middleware::CspScriptNonceInjector#call'
lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call'
config/initializers/008-rack-cors.rb:26:in 'Discourse::Cors#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
lib/middleware/request_tracker.rb:372:in 'Middleware::RequestTracker#call'
lib/middleware/overload_protections.rb:18:in 'Middleware::OverloadProtections#call'
lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call'


Backtrace

app/models/reviewable.rb:860:in 'Reviewable#validate_action!'
app/models/reviewable.rb:360:in 'Reviewable#perform'
app/controllers/admin/users_controller.rb:306:in 'Admin::UsersController#approve'
actionpack (8.0.5) lib/action_controller/metal/basic_implicit_render.rb:8:in 'ActionController::BasicImplicitRender#send_action'
actionpack (8.0.5) lib/abstract_controller/base.rb:215:in 'AbstractController::Base#process_action'
actionpack (8.0.5) lib/action_controller/metal/rendering.rb:193:in 'ActionController::Rendering#process_action'
actionpack (8.0.5) lib/abstract_controller/callbacks.rb:261:in 'block in AbstractController::Callbacks#process_action'
activesupport (8.0.5) lib/active_support/callbacks.rb:120:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:452:in 'block in ApplicationController#with_resolved_locale'
i18n (1.14.8) lib/i18n.rb:354:in 'I18n::Base#with_locale'
app/controllers/application_controller.rb:452:in 'ApplicationController#with_resolved_locale'
activesupport (8.0.5) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:1101:in 'ApplicationController#ensure_dont_cache_page'
activesupport (8.0.5) lib/active_support/callbacks.rb:129:in 'block in ActiveSupport::Callbacks#run_callbacks'
activesupport (8.0.5) lib/active_support/callbacks.rb:140:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.0.5) lib/abstract_controller/callbacks.rb:260:in 'AbstractController::Callbacks#process_action'
actionpack (8.0.5) lib/action_controller/metal/rescue.rb:27:in 'ActionController::Rescue#process_action'
actionpack (8.0.5) lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action'
activesupport (8.0.5) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument'
activesupport (8.0.5) lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument'
activesupport (8.0.5) lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument'
actionpack (8.0.5) lib/action_controller/metal/instrumentation.rb:75:in 'ActionController::Instrumentation#process_action'
actionpack (8.0.5) lib/action_controller/metal/params_wrapper.rb:259:in 'ActionController::ParamsWrapper#process_action'
activerecord (8.0.5) lib/active_record/railties/controller_runtime.rb:39:in 'ActiveRecord::Railties::ControllerRuntime#process_action'
actionpack (8.0.5) lib/abstract_controller/base.rb:152:in 'AbstractController::Base#process'
actionview (8.0.5) lib/action_view/rendering.rb:40:in 'ActionView::Rendering#process'
rack-mini-profiler (4.0.1) lib/mini_profiler/profiling_methods.rb:90:in 'block in ActionController::Base#profile_method'
actionpack (8.0.5) lib/action_controller/metal.rb:252:in 'ActionController::Metal#dispatch'
actionpack (8.0.5) lib/action_controller/metal.rb:335:in 'ActionController::Metal.dispatch'
actionpack (8.0.5) lib/action_dispatch/routing/route_set.rb:67:in 'ActionDispatch::Routing::RouteSet::Dispatcher#dispatch'
actionpack (8.0.5) lib/action_dispatch/routing/route_set.rb:50:in 'ActionDispatch::Routing::RouteSet::Dispatcher#serve'
actionpack (8.0.5) lib/action_dispatch/routing/mapper.rb:32:in 'block in <class:Constraints>'
actionpack (8.0.5) lib/action_dispatch/routing/mapper.rb:62:in 'ActionDispatch::Routing::Mapper::Constraints#serve'
actionpack (8.0.5) lib/action_dispatch/journey/router.rb:53:in 'block in ActionDispatch::Journey::Router#serve'
actionpack (8.0.5) lib/action_dispatch/journey/router.rb:133:in 'block in ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.5) lib/action_dispatch/journey/router.rb:126:in 'Array#each'
actionpack (8.0.5) lib/action_dispatch/journey/router.rb:126:in 'ActionDispatch::Journey::Router#find_routes'
actionpack (8.0.5) lib/action_dispatch/journey/router.rb:34:in 'ActionDispatch::Journey::Router#serve'
actionpack (8.0.5) lib/action_dispatch/routing/route_set.rb:908:in 'ActionDispatch::Routing::RouteSet#call'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call'
rack (2.2.23) lib/rack/tempfile_reaper.rb:15:in 'Rack::TempfileReaper#call'
rack (2.2.23) lib/rack/conditional_get.rb:40:in 'Rack::ConditionalGet#call'
rack (2.2.23) lib/rack/head.rb:12:in 'Rack::Head#call'
actionpack (8.0.5) lib/action_dispatch/http/permissions_policy.rb:38:in 'ActionDispatch::PermissionsPolicy::Middleware#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:417:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:12:in 'Middleware::CspScriptNonceInjector#call'
lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call'
config/initializers/008-rack-cors.rb:26:in 'Discourse::Cors#call'
rack (2.2.23) lib/rack/session/abstract/id.rb:266:in 'Rack::Session::Abstract::Persisted#context'
rack (2.2.23) lib/rack/session/abstract/id.rb:260:in 'Rack::Session::Abstract::Persisted#call'
actionpack (8.0.5) lib/action_dispatch/middleware/cookies.rb:706:in 'ActionDispatch::Cookies#call'
actionpack (8.0.5) lib/action_dispatch/middleware/callbacks.rb:31:in 'block in ActionDispatch::Callbacks#call'
activesupport (8.0.5) lib/active_support/callbacks.rb:100:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.0.5) lib/action_dispatch/middleware/callbacks.rb:30:in 'ActionDispatch::Callbacks#call'
actionpack (8.0.5) lib/action_dispatch/middleware/debug_exceptions.rb:31:in 'ActionDispatch::DebugExceptions#call'
actionpack (8.0.5) lib/action_dispatch/middleware/show_exceptions.rb:32:in 'ActionDispatch::ShowExceptions#call'
logster (2.21.0) lib/logster/middleware/reporter.rb:40:in 'Logster::Middleware::Reporter#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
lograge (0.14.0) lib/lograge/rails_ext/rack/logger.rb:18:in 'Rails::Rack::Logger#call_app'
railties (8.0.5) lib/rails/rack/logger.rb:29:in 'Rails::Rack::Logger#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
actionpack (8.0.5) lib/action_dispatch/middleware/request_id.rb:34:in 'ActionDispatch::RequestId#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
rack (2.2.23) lib/rack/method_override.rb:24:in 'Rack::MethodOverride#call'
rack (2.2.23) lib/rack/sendfile.rb:127:in 'Rack::Sendfile#call'
plugins/discourse-prometheus/lib/middleware/metrics.rb:14:in 'DiscoursePrometheus::Middleware::Metrics#call'
rack-mini-profiler (4.0.1) lib/mini_profiler.rb:191:in 'Rack::MiniProfiler#call'
message_bus (4.5.2) lib/message_bus/rack/middleware.rb:60:in 'MessageBus::Rack::Middleware#call'
lib/middleware/request_tracker.rb:372:in 'Middleware::RequestTracker#call'
actionpack (8.0.5) lib/action_dispatch/middleware/remote_ip.rb:96:in 'ActionDispatch::RemoteIp#call'
lib/middleware/overload_protections.rb:18:in 'Middleware::OverloadProtections#call'
lib/middleware/processing_request.rb:14:in 'Middleware::ProcessingRequest#call'
rails_failover (2.3.0) lib/rails_failover/active_record/middleware.rb:67:in 'block in RailsFailover::ActiveRecord::Middleware#call'
activerecord (8.0.5) lib/active_record/connection_handling.rb:401:in 'ActiveRecord::ConnectionHandling#with_role_and_shard'
activerecord (8.0.5) lib/active_record/connection_handling.rb:149:in 'ActiveRecord::ConnectionHandling#connected_to'
rails_failover (2.3.0) lib/rails_failover/active_record/middleware.rb:64:in 'RailsFailover::ActiveRecord::Middleware#call'
rails_multisite (7.0.0) lib/rails_multisite/middleware.rb:26:in 'RailsMultisite::Middleware#call'
railties (8.0.5) lib/rails/engine.rb:535:in 'Rails::Engine#call'
railties (8.0.5) lib/rails/railtie.rb:226:in 'Kernel#public_send'
railties (8.0

Env

HTTP HOSTS: my-forum.discourse.group

لست متأكدًا مما يسبب هذا. هناك مستخدمون آخرون تم إخفاؤهم وتمت الموافقة عليهم بنجاح بمجرد تفعيل الإعداد.

إعجابَين (2)

هذه أيضًا مني تأكيدًا على ذلك.

(تحرير: اكتشفت مستخدمًا واحدًا فقط في هذه الحالة، كان نشطًا قبل بضعة أسابيع، ولم يتم إخفاء هويته)

إعجابَين (2)

تأكيدك بـ «أنا أيضًا» مفيد جدًا، فهو يؤكد أن إخفاء هوية المستخدم ليس هو سبب هذه الخلل.

مستكشف البيانات يشير إلى أن المستخدم قابل للمراجعة من قبل المشرف

user_id id type target_id target_type reviewable_by_moderator
anon84265489 264 ReviewableUser 123 User true
query
SELECT 
    u.id AS user_id,
    r.id,
    r.type,
    r.target_id,
    r.target_type,
    r.reviewable_by_moderator
FROM reviewables r
JOIN users u
    ON r.target_id = u.id
WHERE u.approved = false
  AND u.active = true
إعجاب واحد (1)

لا أفهم كيف يحدث هذا الخلل، لكن يمكنني على الأقل العثور على بعض أجزاء الكود التي تستنتج أن هذا الإجراء لا يمكن تنفيذه. غير أنني لا أدرك سبب استنتاجهم ذلك. أظن أن المنطق موجود في السطر 859 في reviewable.rb.

توجد دالة approve() في السطر 306 من ملف users_controller.rb

وتوجد دالة perform() في السطر 360 من ملف reviewable.rb

أما دالة validate_action!() فتوجد في السطر 860 من ملف reviewable.rb وهي التي تثير الاستثناء

أعتقد أن المشكلة قد تكون في أن المستخدم تمت مراجعته مسبقًا. لست متأكدًا مما إذا كان من الممكن مراجعة نفس المستخدم مرة أخرى. حتى الآن، لم أتمكن من إعادة إنتاج هذه الحالة.

ما زلت لم أتمكن من إعادة إنتاجها. لكنني اكتشفت أن المستخدم الذي لا يظهر في قائمة المراجعة قد تم تصنيفه كـ suspect_user بعد تسجيله في ديسمبر. في ذلك الوقت، كانت إعدادية must_approve_users معطلة في منتداي. لذا، اتخذت إجراءً تجاهه آنذاك. لست متأكدًا مما إذا كان disagreed يعني أنني اخترت إبقاء المستخدم. ولكن عندما حاولت إعادة الإنتاج الآن، كانت الخيار الوحيد الآخر هو حذف المستخدم. لست متأكدًا كيف حدث status = 2.

عندما فعّلت must_approve_users قبل بضعة أسابيع، لم يتم الموافقة على المستخدم تلقائيًا لأنه كان هناك عنصر قابل للمراجعة يحمل معرف المستخدم (user_id) كمعرف الهدف (target_id). هذا منطقي.

لكنني ما زلت لا أعرف كيف انتهى بي الأمر إلى مستخدم لم أوافق عليه، ولم أحذفه أيضًا عندما تم تصنيفه.

reviewable status status reason context created_at
264 disagreed 2 suspect_user NULL 2025-12-18T14:16:28.322Z
query
SELECT
    rs.reviewable_id,
    CASE
      WHEN rs.status = 0 THEN 'pending'
      WHEN rs.status = 1 THEN 'agreed'
      WHEN rs.status = 2 THEN 'disagreed'
      WHEN rs.status = 3 THEN 'ignored'
    END as status,
    rs.status as status_id,
    rs.reason,
    rs.context,
    rs.created_at
FROM reviewable_scores rs
JOIN reviewables r
ON rs.reviewable_id = r.id
JOIN users u
ON r.target_id = u.id
WHERE u.approved = false
AND u.active = true
إعجاب واحد (1)

عظيم - يبدو أن الأمر نفسه ينطبق عليّ - مستخدم (في حالتي، مستخدم نشط وحقيقي حتى قبل بضعة أسابيع) كان قد حصل في الماضي البعيد على حالة «مستخدم مشبوه».

أعتقد أن هذا المستخدم ربما وجد نفسه غير قادر على استخدام المنتدى منذ أن فعلت ميزة اعتماد المستخدمين الجدد.
انضم في 9 أبريل 2021، آخر منشور في 16 أبريل، آخر ظهور في 16 أبريل، عدد المشاهدات 1311، مستوى الثقة: عضو.
الإحصائيات: 78 يومًا من الزيارات، 4 ساعات من وقت القراءة، 3 دقائق من وقت القراءة الأخير، 83 موضوعًا تمت مشاهدته، 491 منشورًا تمت قراءته، 6 إعطاءات، 31 استلامًا، 4 مواضيع تم إنشاؤها، 25 منشورًا تم إنشاؤه.

عند العودة إلى قائمة المراجعة الخاصة بي، لا أرى أي عناصر في ذلك التاريخ، ولا أي عناصر تحمل اسم هذا المستخدم.

أدرك الآن أنه في حالتي، حصلنا على مستخدم سبام، تم اختيار المعرف 332، وتمت الإشارة إليه وحذفه. بعد بضعة أيام، حصلنا على مستخدم جديد، اختار مرة أخرى المعرف 332.

مع معرف المستخدم المعني للمستخدم الصالح، قمت بتشغيل استعلام مستكشف البيانات التالي:

SELECT *
FROM reviewables
WHERE target_id = 332
ORDER BY created_at DESC