هل يمكنك تسلسل وحدة تحكم؟

مرحباً بمجتمع Discourse. لم أجد موضوعاً مشابهاً، لذا فكرت في بدء واحد.

أنا أستخدم إضافة لتوسيع وظائف Discourse لأغراض مؤسستي. أحد هذه الأغراض هو عرض JSON من email/unsubscribe/{KEY}، حيث نرغب في التحكم في هذه الخيارات من خادم مختلف عن الخادم الذي ندير عليه مثيل Discourse الخاص بنا. هذا المسار يقع تحت إشراف EmailController، وبشكل افتراضي، يقوم EmailControllerHelper بتعيين متغيرات المثيل للوحدة قبل عرض طريقة عرض. بدلاً من ذلك، أود أن أعيد EmailController كـ JSON.

لذا، سؤالي الأساسي هو، هل من الممكن تسلسل وحدة تحكم؟ أي، هل يمكنني تعريف مسلسل للوحدة مثل هذا:

  class ::EmailController
    # الملف الذي يعدله هذا: app/controllers/email_controller.rb
    # إرجاع JSON

    module ReturnAsJSON
      def unsubscribe
        super

        render EmailUnsubscribeSerializer.new(self, root: false).to_json
      end
    end

    prepend ReturnAsJSON
  end

  class EmailUnsubscribeSerializer < ApplicationSerializer
    attributes :topic, :type, :unsubscribed_from_all, :user

    def user
      BasicUserSerializer.new(object.user, root: false).as_json
    end
  end

أم أنني أفضل فرض هذا بالقوة؟

  class ::EmailController
    # الملف الذي يعدله هذا: app/controllers/email_controller.rb
    # إرجاع JSON

    module ReturnAsJSON
      def unsubscribe
        super

        render json: {type: @type, unsubscribed_from_all: @unsubscribed_from_all, etc.}
      end
    end

    prepend ReturnAsJSON
  end

يبدو أن النهج الثاني يعمل، لذلك إذا لم ينجح النهج الأول، فعلى الأقل لدي حل بديل جيد.

ابحث في المكونات الإضافية الموجودة أو مصدر الخطاب عن add_to_serializer.

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

شكراً @pfaffman، لكن لا أعتقد أن هذا ما أبحث عنه. لقد جربت هذا المسار لفترة، (وأستخدمه بالفعل في مكان آخر في المكون الإضافي المخصص الخاص بنا)، لكنني لا أعرف ما إذا كان سيساعد هنا.. على حد علمي، لا يوجد أي متحكم في مستودع Discourse يتم تسلسله. أنا لا أحاول الإضافة إلى مُسلسل موجود، بل أحاول إنشاء مُسلسل جديد.

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

آه. ثم تحتاج إلى إضافة نموذج Rails ثم إضافة نموذج إلى Ember. لقد فعلت ذلك عدة مرات وما زلت أجده مربكًا للغاية.

تحقق من إضافة مكون إضافي آخر يقوم بإضافة مسار. الاشتراكات هو أحدها، ولكن يمكنك أيضًا الحصول على GitHub - discourse/all-the-plugins ثم البحث عن “route*”. جزء Rails موجود في config وجزء Ember موجود في assets/javascripts/discourse/routes.

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

عظيم، شكرًا لك. قد أتمكن من الاستغناء عن Ember، حيث لا يُفترض أن يرى المستخدمون واجهة Discourse الأمامية على الإطلاق.

لقد فعلت ذلك عدة مرات ولا أزال أجده مربكًا للغاية.

هذا بعض الراحة هنا. ربما سأختار طريقي الثاني أعلاه وأقيّم ما إذا كانت هناك حاجة لنقطة نهاية جديدة هنا. شكرًا!

هذا يجعل الأمر أسهل بكثير (بالنسبة لي، خاصة). لذا بعد إضافة المسار، تقوم بسحب /your-new-route.json وهذا يجب أن يفي بالغرض، وبعد ذلك يمكنك تجنب الملفات الثلاثة إلى الخمسة (أم خمسمائة؟) الأخرى التي يتعين عليك إنشاؤها في Ember.

لذا، تقوم بإضافة المسار ثم إضافة المتحكم والنموذج. أعتقد أن هذه هي الملفات الثلاثة فقط التي يتعين عليك إنشاؤها.

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