Wie ruft man Gruppenbesitzer ab? (Rails-Code-Frage)

Ich denke, diese Frage geht ins Detail von Rails, aber hier mein Versuch:

Ich versuche herauszufinden, wie ich den oder die Besitzer jeder Gruppe auf der Gruppen-Indexseite anzeigen kann (entsprechend dieser Seite).

Mein Ausgangspunkt ist das Gruppenmodell, was mir nahelegt, dass das Merkmal „Gruppenbesitzer

Ich bin nicht ganz sicher, was du erreichen möchtest, aber ich denke, du suchst nach GroupUser. Du kannst eine Liste der Gruppen-IDs und der Benutzer-IDs ihrer Besitzer mit etwas wie folgendem erhalten:

GroupUser.where(owner: true).pluck("group_id", "user_id")
5 „Gefällt mir“

Danke, das ist definitiv ein Schritt nach vorn. Mein Ziel ist es, die Eigentümer einer Gruppe unter dem Gruppennamen auf der Gruppenindexseite anzuzeigen.

EDIT: Zum Beispiel so etwas wie:

<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>

Das funktioniert nicht ganz. Was fehlt?

1 „Gefällt mir“

Du musst ein kleines Plugin schreiben, um die richtigen Informationen zu serialisieren. Ich habe deinen Beitrag im Marketplace gesehen. Hoffentlich nimmt sich jemand deiner an!

Wenn du ernsthaft beginnen möchtest, Plugins zu entwickeln, könntest du einen Blick auf folgenden Link werfen: Learn how to start building stuff for Discourse if you're newbie (like myself)

Ich habe etwas als sehr rohen Proof of Concept zusammengebastelt, das dir vielleicht als Ausgangspunkt dient, um es selbst herauszufinden:

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

Im <head>-Tab eines Themes

<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>

Wenn du all das zusammenfügst und das Plugin in deinen Site-Einstellungen aktivierst, solltest du die Benutzer-IDs der Gruppenbesitzer auf der Gruppenseite aufgelistet sehen.

Ich kann dir darüber hinaus nicht weiterhelfen, also viel Erfolg!

6 „Gefällt mir“

Das ist extrem hilfreich – vielen Dank. Ich habe verstanden, dass Sie keine weitere Code-Hilfe leisten können, aber ich hoffe, ich kann zwei allgemeine Fragen stellen, die auch für andere hilfreich sein könnten:

–Könnten Sie kurz erklären, warum ein Serializer hier notwendig ist? (Ich versuche, das nicht nur für diesen Fall, sondern auch für andere Anpassungen zu verstehen.)

Und noch eine kurze Frage: Könnte ich das nicht einfach in meinem Dashboard umsetzen? (Ein Plugin zu erstellen wäre zwar definitiv organisierter, aber da ich einen gehosteten Plan habe, kann ich keine neuen Plugins direkt importieren – das erfordert zumindest einige zusätzliche Schritte.)

1 „Gefällt mir“

Klar :slight_smile: Die Daten werden standardmäßig nicht im BasicGroupSerializer offengelegt. Wir nehmen nur auf, was wir benötigen.

Es ist ein bisschen wie ein Labyrinth, aber der einzige Grund, warum die groups-info-Komponente über das verfügt, was sie hat, ist, dass sie group von ihrer übergeordneten Vorlage erhält:

Und die übergeordnete Vorlage erhält es vom Controller:

Das fürchte ich nicht. Es sei denn, es gibt irgendeine Magie, von der ich nichts weiß!

2 „Gefällt mir“

Toll. Vielen Dank für diese hilfreichen Informationen.

1 „Gefällt mir“

Edit: verschoben hier, nachdem mir aufgefallen ist, dass meine Frage besser in einem separaten Thema aufgehoben ist.

Hallo @tshenry, ich versuche, ein Plugin zu erstellen, das Code enthält, ähnlich wie du ihn oben bereitgestellt hast, um den Gruppenbesitzer offenzulegen. Eine Frage, die ich gerade kläre:

– Das relevante Modell hier ist „group

Das liegt daran, dass ‘basic_group’ in diesem Fall der Name des Serializers ist: discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

3 „Gefällt mir“

Wie hast du festgestellt, dass dieser Serialisierer der richtige für diesen Fall ist?

Das habe ich zusammengetragen: Im Groups-Controller ruft die index-Aktion die Funktion (bzw. Methode) render_json_dump auf, die den BasicGroupSerializer im Aufruf von serialize_data verwendet.

Die relevante Seite zur Anzeige der Gruppendaten ist der Groups-Index, daher ist die index-Aktion im Controller der richtige Anhaltspunkt.

Ist das der Grund, warum du weißt, dass der BasicGroupSerializer hier der richtige ist, auf den Bezug genommen werden soll?

Wenn das alles korrekt ist, würde dann der GroupShowSerializer für die Anzeige der Gruppe auf der Detailseite verwendet werden, da dieser Serialisierer in der show-Aktion des Controllers referenziert wird? (Die Seite mit den Details einer Gruppe – auch wenn es keine explizite „groups.show“-Ansicht zu geben scheint.)

Und was ist, wenn kein Serialisierer referenziert wird, wie beispielsweise in der new-Aktion im Controller?

Das ist tatsächlich der Grund.

Weil das keine GET-Methode ist. Die Serialisierung dient der Übertragung großer Mengen wiederholender Daten im Downlink.

@JQ331, wirf einen Blick auf das Herz der Router-Konfiguration hier: discourse/config/routes.rb at main · discourse/discourse · GitHub

Das zeigt dir, wie alle Routen und Controller-Methoden in der Basisanwendung miteinander verbunden sind.

Überlege auch, folgende Anleitung durchzulesen: Rails Routing from the Outside In — Ruby on Rails Guides

Eine zusätzliche Anmerkung, die wirklich verwirrend ist und mich anfangs sehr verwirrt hat: Rails ist ein Framework und nutzt sehr strenge Namenskonventionen, um seine Magie zu entfalten. Wenn man es nicht gewohnt ist, ist nicht sofort ersichtlich, wie alles zusammenhängt, aber sobald man die Namenskonventionen berücksichtigt, wird es allmählich klarer.

1 „Gefällt mir“

Danke für den Hinweis – das ist sehr hilfreich. Ich finde die Routendatei jedoch etwas verwirrend. So weit ich das überblicke, wird beispielsweise keine Gruppen-Controller-Aktion groups#index referenziert, obwohl dies eindeutig die relevante Aktion für die Hauptseite der Gruppe ist. Allerdings sehe ich die Aktion groups#index, wenn ich folgenden Befehl ausführe:
% rails routes. Das ist wohl auch eine hilfreiche Möglichkeit zu erkennen, wie eine bestimmte Seite einem Controller zugeordnet ist.

Lass die Dokumentation nicht aus :wink:

So funktioniert das:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

Siehe: Rails Routing from the Outside In — Ruby on Rails Guides

Das ist eine sehr prägnante Möglichkeit, viele Methoden zu routen.

3 „Gefällt mir“