كيفية استعادة مالكي المجموعة؟ (سؤال حول كود Rails)

أعتقد أن هذا السؤال يتعمق في تفاصيل Rails، ولكن ها أنا ذا:

أحاول معرفة كيفية عرض المالك أو الملاك لكل مجموعة في صفحة فهرس المجموعات (ما يعادل هذه الصفحة).

نقطة البداية لدي هي نموذج المجموعة، والذي يوحي لي بأن سمة مالكي المجموعة ليست مرفقة مباشرة بالمجموعة (على عكس، على سبيل المثال، “full_name”، الذي يمكنني رؤيته جزءًا من مخطط المجموعة في أسفل تلك الرابطة).

إذًا من الواضح أنني لا أستطيع استدعاء group.owners كما أستطيع استدعاء group.full_name. وبالمثل، لا أعتقد أنه يمكنني استعادة هذه المعلومات من واجهة برمجة التطبيقات (API) عن طريق جلب معلومات حول مجموعة، لأن “owners” لا يبدو أنه أحد القيم المُرجعة.

كيف يمكنني استعادة مالكي المجموعة لعرض هذه المعلومات؟

أنا لست متأكداً تماماً مما تحاول تحقيقه، لكنني أعتقد أنك تبحث عن GroupUser. يمكنك الحصول على قائمة بمعرفات المجموعات (group_ids) ومعرفات المستخدمين (user_ids) لأصحابها باستخدام شيء مثل:

GroupUser.where(owner: true).pluck("group_id", "user_id")

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

تعديل: على سبيل المثال، شيء مثل هذا:

<script type="text/x-handlebars" data-template-name="components/groups-info">
 {{#if showFullName}}
  <span class="groups-info-name">{{group.full_name}}</span>
  {{#each group.group_users as |gUser|}}
      {{#if gUser.owner}}
            <div>{{gUser.user.name}}</div>
      {{/if}}
  {{/each}}
{{else}}
  <span class="groups-info-name">{{group.displayName}}</span>
{{/if}}
</script>

هذا لا يعمل تمامًا. ما الذي ينقص؟

ستحتاج إلى كتابة إضافة صغيرة لتسلسل المعلومات الصحيحة. لقد رأيت مشاركتك في Marketplace. آمل أن يقبل شخص ما التحدي!

إذا كنت ترغب في البدء في استكشاف الإضافات بجدية، فقد تفكر في الاطلاع على Learn how to start building stuff for Discourse if you're newbie (like myself)

لقد قمت بدمج شيء ما كدليل مفهوم أولي خشن للغاية قد يمنحك نقطة انطلاق لتكتشفه بنفسك:

my-plugin/plugin.rb

# frozen_string_literal: true

# name: Group Test
# about: Group Test
# version: 0.1
# authors: Tester
# url: https://github.com/someone/something

enabled_site_setting :group_test_enabled

after_initialize do
  add_to_serializer(:basic_group, :owners) do
    GroupUser.where(group_id: object.id, owner: true).pluck("user_id")
  end
end

my-plugin/config/settings.yml

plugins:
  group_test_enabled:
    default: false
    client: true

في علامة التبويب <head> الخاصة بالمظهر

<script type="text/x-handlebars" data-template-name="components/groups-info">
 {{#if showFullName}}
   <span class="groups-info-name">{{group.full_name}}</span>
 {{else}}
   <span class="groups-info-name">{{group.displayName}}</span>
   {{#each group.owners as |owner|}}
      {{#if owner}}
        <div>{{owner}}</div>
      {{/if}}
   {{/each}}
 {{/if}}
</script>

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

لن أتمكن من المساعدة بعد ذلك، لذا حظًا موفقًا!

هذا مفيد للغاية—شكرًا لك. لقد فهمت أنك غير قادر على تقديم المزيد من المساعدة المتعلقة بالكود، لكنني آمل أن أتمكن من طرح سؤالين عامّين قد يجدهما الآخرون مفيدًا أيضًا:

—هل يمكنك شرح سبب ضرورة استخدام المُسلسل (serializer) هنا باختصار؟ (أحاول الفهم ليس فقط في هذا السياق بل أيضًا في التخصيصات الأخرى)

وسؤال سريع آخر: هل يمكنني تحقيق هذا فقط من خلال لوحة التحكم الخاصة بي؟ (فإن إنشاء إضافة سيكون بالتأكيد أكثر تنظيمًا، لكن بما أنني على خطة مستضافة، فلا يمكنني استيراد إضافات جديدة مباشرةً—فذلك يتطلب على الأقل بضع خطوات إضافية)

بالتأكيد :slight_smile: البيانات غير مكشوفة افتراضيًا في BasicGroupSerializer. نحن ندرج فقط ما نحتاجه.

الأمر يشبه متاهة بعض الشيء، لكن السبب الوحيد لوجود ما يوجد في مكون groups-info هو أنه يستقبل group من قالبه الأب:

ويحصل القالب الأب عليه من وحدة التحكم (controller):

أخشى أن ذلك غير ممكن. ما لم تكن هناك سحرية لا أعرفها!

رائع. شكرًا جزيلاً لك على هذه المعلومات المفيدة.

تعديل: تم النقل هنا بعد أن أدركت أن السؤال الذي طرحته أكثر ملاءمة لموضوع منفصل.

مرحبًا @tshenry، أحاول تشغيل إضافة تتضمن بعض الكود الذي قدمته أعلاه لكشف مالك المجموعة. لدي سؤال أعمل على حله:

– النموذج ذو الصلة هنا هو “group” (المشار إليه بواسطة groups-info)
– ولكن في المعالج التسلسلي (serializer)، لم تقل: add_to_serializer(:group, :owners)… بدلاً من الإشارة إلى :group، تشير إلى :basic_group، مثل:

add_to_serializer(:basic_group, :owners)

لماذا تشير إلى basic_group بدلاً من group في دالة add_to_serializer؟

السبب هو أن ‘basic_group’ هو اسم السيريالايزر في هذه الحالة: discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

كيف عرفت أن هذا المصمم (serializer) هو الأنسب لهذه الحالة؟

هذا ما أستطيع استخلاصه: في متحكم المجموعات، داخل إجراء index، توجد دالة (أو طريقة) تُسمى render_json_dump تتضمن BasicGroupSerializer في استدعاء serialize_data.

الصفحة ذات الصلة لعرض بيانات المجموعات هي فهرس المجموعات، لذا فإن إجراء index في المتحكم هو الصحيح للنظر فيه هنا.

هل هذه هي الطريقة التي عرفت بها أن BasicGroupSerializer هو الأنسب للإشارة إليه هنا؟

إذا كان كل ذلك صحيحًا، فهل سيتم استخدام GroupShowSerializer عند عرض صفحة عرض المجموعة، لأن هذا هو المصمم المذكور في إجراء show في المتحكم؟ (الصفحة التي تحتوي على تفاصيل مجموعة - رغم أنه لا يبدو أن هناك عرضًا يُسمى “groups.show”)).

وماذا عن الحالة التي لا يُشار فيها إلى أي مصمم، مثلما يحدث في إجراء new في المتحكم؟

هذا هو السبب بالفعل.

لأن ذلك ليس طريقة GET. فالتسلسل مخصص للكميات الكبيرة من البيانات المتكررة في قناة الهبوط.

@JQ331، انظر إلى قلب إعدادات الموجه هنا: discourse/config/routes.rb at main · discourse/discourse · GitHub

سيُظهر لك كيفية ربط جميع المسارات وطرق المتحكم في التطبيق الأساسي.

كما يُنصح بقراءة الدليل التالي: Rails Routing from the Outside In — Ruby on Rails Guides

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

شكرًا على هذا المرجع، إنه مفيد جدًا. أجد ملف التوجيهات محيرًا بعض الشيء. على سبيل المثال، قدر ما أستطيع، لا توجد إشارة إلى إجراء تحكم groups#index، رغم أنه بوضوح الإجراء ذو الصلة لصفحة المجموعة الرئيسية. ومع ذلك، أرى إجراء groups#index عندما أقوم بتشغيل:
% rails routes، وهو ما أعتقد أنه أيضًا طريقة مفيدة لمعرفة كيف تتوافق صفحة معينة مع وحدة تحكم.

لا تتجاهل الوثائق :wink:

إليك كيف يعمل ذلك:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

انظر: Rails Routing from the Outside In — Ruby on Rails Guides

هذه طريقة موجزة جدًا لتوجيه العديد من الطرق.