خطأ 500 عند الموافقة على منشور قابل للمراجعة بعد تعديل العلامات في /review (تم حفظ العلامات ككائنات، وليس سلاسل نصية)

الملخص

في قائمة المراجعة (/review)، إذا قام مشرف بتحرير الوسوم (tags) على منشور مُدرج في القائمة ثم نقر على موافقة (Approve)، يفشل طلب الموافقة مع خطأ خادم داخلي 500 (500 Internal Server Error).


خطوات إعادة الإنتاج

  1. تأكد من وجود منشور ينتظر في قائمة المراجعة (على سبيل المثال، من مستخدم/مجموعة تتطلب الموافقة).
  2. انتقل إلى /review.
  3. افتح العنصر المُدرج في القائمة.
  4. حرر الوسوم باستخدام واجهة اختيار الوسوم.
  5. انقر على موافقة (Approve).
  6. لاحظ استجابة 500.

السلوك المتوقع

يجب الموافقة على المنشور بنجاح، مع تطبيق الوسوم المحدثة.


السلوك الفعلي

تفشل الموافقة مع خطأ 500.

نمط الطلب المثالي:

PUT /review/{id}/perform/approve_post?version={x} → 500 (Internal Server Error)

ما يبدو أنه يحدث (السبب الجذري)

بعد تحرير الوسوم في واجهة المراجعة، تقوم حمولة العنصر القابل للمراجعة (reviewable payload) بتخزين كائنات الوسوم الكاملة بدلاً من سلاسل أسماء الوسوم.

قبل تحرير الوسوم:

payload["tags"] = ["tag-one", "tag-two"]

بعد تحرير الوسوم في /review:

payload["tags"] = [
  {"id"=>123, "name"=>"tag-one", "description"=>nil, "count"=>50, ...},
  {"id"=>456, "name"=>"tag-two", "description"=>nil, "count"=>30, ...}
]

عندما تعالج عملية الموافقة الوسوم، يبدو أنها تتوقع سلاسل نصية، لكنها تتلقى كائنات/تجزئات (hashes/objects)، مما يؤدي إلى خطأ 500.


الحل البديل

قم بتطبيع (Normalize) الوسوم مرة أخرى إلى أسماء:

r = ReviewableQueuedPost.find(ID)
r.payload["tags"] = r.payload["tags"].map { |t| t.is_a?(Hash) ? t["name"] : t }
r.save!

شكراً للإبلاغ. سنلقي نظرة.

إعجاب واحد (1)