لا يتم استرجاع الحقول المخصصة في حدث :approved_post

أحاول حفظ الحقول المخصصة لمنشور يحتاج إلى مراجعة. عند الموافقة على المنشور، لا يتم حفظ الحقول المخصصة.

لقد تحققت من حدث :approved_post، ولا يتم تعيين الحقول المخصصة في الحمولة (payload).

كيف يمكنني الحفاظ على الحقول المخصصة للمنشورات القابلة للمراجعة؟

أيضًا، استخدمت NewPostManager، وفي المعالج تكون الحقول المخصصة متاحة، ولكن بالطبع يتم تفعيله قبل حفظ البيانات في جداول القابلة للمراجعة.

هل يمكنك إظهار بعض الكود؟ بشكل مثالي، الحد الأدنى الذي يمكننا استخدامه لإعادة إنتاج هذه المشكلة.

أقوم بإصلاح مشكلة في إضافة الفعاليات حيث لا يتم حفظ بيانات الفعاليات في حقل post_custom_field إذا كانت الفئة مضبوطة على طلب الموافقة للمواضيع.

لقد راجعت إضافة stops، ويبدو أن الحقول المخصصة تُضبط هناك على :approved_post.

هذا مقتطف من إضافة polls:

NewPostManager.add_handler(1) do |manager|
    post = Post.new(raw: manager.args[:raw])

    if !DiscoursePoll::PollsValidator.new(post).validate_polls
      result = NewPostResult.new(:poll, false)

      post.errors.full_messages.each do |message|
        result.errors[:base] << message
      end

      result
    else
      manager.args["is_poll"] = true
      nil
    end
  end
on(:approved_post) do |queued_post, created_post|
    if queued_post.payload["is_poll"]
      created_post.validate_polls(true)
    end
  end

في محاولتي، بيانات الحقول المخصصة متاحة في NewPostManager، لكن مثيل ReviewableQueuedPost في استدعاء :approved_post (والذي من المفترض نظريًا أن يحتوي على الحقل المخصص في حمولته) لا يحتوي عليها.

لقد جربت:

NewPostManager.add_handler do |manager|
 if manager.args['event'] && NewPostManager.post_needs_approval?(manager) # هذا الشرط صحيح
      manager.args['is_event'] = true
end

ثم:

on(:approved_post) do |reviewable, post|
   p reviewable.payload['is_event'] # البيانات غير متاحة هنا
 end

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

أشتبه في وجود خلل هنا يتعلق بالاستطلاعات والمنشورات المعلقة. أعتقد أن دالة validate_polls لا تُستدعى أبدًا بعد الموافقة. @Roman، هل يمكنك التحقق من ذلك؟

أؤكد أن هذا خطأ برمجي. لم يتم تخزين is_poll داخل الحمولة، مما يجعل استدعاء العودة غير مفيد.

إليك طلب دمج لإصلاح ذلك:

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

شكرًا جزيلاً لكما يا @Roman و @eviltrout. لقد قضيت يومين كاملين في محاولة حل هذه المشكلة.

أحسنت يا @fzngagan!

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

@fzngagan يبدو أن هذا موجود بالفعل في tests-passed، انظر Commits · discourse/discourse · GitHub

@merefield. آه، لم ألاحظ ذلك.