Comment récupérer les propriétaires de groupe ? (Question sur le code Rails)

Je pense que cette question s’enfonce dans les détails de Rails, mais voici :

J’essaie de comprendre comment afficher le ou les propriétaires de chaque groupe sur la page d’index des groupes (l’équivalent de cette page).

Mon point de départ est le modèle de groupe, ce qui m’indique que la caractéristique « propriétaires du groupe » n’est pas directement attachée à un groupe (contrairement, par exemple, à « full_name », qui fait partie du schéma du groupe, comme on peut le voir en bas de ce lien).

Il est donc clair que je ne peux pas appeler group.owners comme je peux appeler group.full_name. De même, je ne pense pas pouvoir récupérer ces informations via l’API en obtenant les détails d’un groupe, car « owners » ne semble pas être l’une des valeurs renvoyées.

Comment puis-je récupérer les propriétaires d’un groupe pour afficher ces informations ?

Je ne suis pas tout à fait certain de ce que vous essayez d’accomplir, mais je pense que vous cherchez GroupUser. Vous pouvez obtenir une liste des group_ids et des user_ids de leurs propriétaires en utilisant quelque chose comme :

GroupUser.where(owner: true).pluck("group_id", "user_id")
5 « J'aime »

Merci, c’est indéniablement un pas en avant. Mon objectif est d’afficher les propriétaires d’un groupe sous le nom du groupe sur la page d’index des groupes.

EDIT : Par exemple, quelque chose comme ceci :

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

Cela ne fonctionne pas tout à fait. Qu’est-ce qui manque ?

1 « J'aime »

Vous devrez écrire un petit plugin pour sérialiser les bonnes informations. J’ai vu votre publication sur Marketplace. J’espère que quelqu’un s’en saisira !

Si vous souhaitez commencer à explorer sérieusement les plugins, vous pourriez consulter Learn how to start building stuff for Discourse if you're newbie (like myself)

J’ai assemblé quelque chose de manière très approximative comme preuve de concept, ce qui pourrait vous donner un point de départ pour comprendre par vous-même :

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

Dans l’onglet <head> d’un thème

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

Si vous assemblez tout cela et activez le plugin dans les paramètres de votre site, vous devriez voir les identifiants des propriétaires du groupe affichés sur la page des groupes.

Je ne pourrai pas vous aider au-delà de cela, donc bonne chance !

6 « J'aime »

C’est extrêmement utile, merci. J’ai bien compris que vous ne pouviez pas fournir d’aide supplémentaire sur le code, mais j’espère pouvoir poser deux questions générales qui pourraient aussi être utiles à d’autres :

– Pouvez-vous brièvement expliquer pourquoi un sérialiseur est nécessaire ici ? (Je cherche à comprendre, non seulement pour ce cas, mais aussi pour d’autres personnalisations)

Et juste une petite question : pourrais-je réaliser cela directement dans mon tableau de bord ? (créer un plugin serait certes beaucoup plus organisé, mais comme je suis sur un plan hébergé, je ne peux pas importer directement de nouveaux plugins ; cela nécessite au moins quelques étapes supplémentaires)

1 « J'aime »

Bien sûr :slight_smile: Les données ne sont pas exposées par défaut dans le BasicGroupSerializer. Nous n’incluons que ce dont nous avons besoin.

C’est un peu un labyrinthe à suivre, mais la seule raison pour laquelle le composant groups-info dispose de ce qu’il a, c’est parce qu’il reçoit group de son modèle parent :

Et le modèle parent l’obtient du contrôleur :

Je crains que non. Sauf s’il existe une magie dont je ne serais pas au courant !

2 « J'aime »

Super. Merci beaucoup pour ces informations utiles.

1 « J'aime »

Édition : déplacé ici après avoir réalisé que la question que j’ai posée est plus appropriée pour un sujet séparé.

Bonjour @tshenry, j’essaie de mettre en place un plugin qui inclut du code similaire à celui que vous avez fourni ci-dessus pour exposer le propriétaire du groupe. J’ai une question à clarifier :

– le modèle pertinent ici est “group” (celui qui est référencé par groups-info)
– mais dans le sérialiseur, vous ne dites pas : add_to_serializer(:group, :owners)… Au lieu de référencer :group, vous référez à :basic_group, comme ceci :

add_to_serializer(:basic_group, :owners)

Pourquoi référencez-vous basic_group plutôt que group dans add_to_serializer ?

C’est parce que ‘basic_group’ est le nom du sérialiseur dans ce cas : discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

3 « J'aime »

Comment avez-vous identifié que ce sérialiseur était le bon pour ce cas ?

Voici ce que j’ai pu comprendre : Dans le contrôleur des groupes, dans l’action index, il existe une fonction (ou méthode) render_json_dump qui inclut le BasicGroupSerializer dans l’appel serialize_data.

La page pertinente pour afficher les données des groupes est l’index des groupes, c’est donc l’action index du contrôleur qu’il faut examiner ici.

Est-ce ainsi que vous savez que le BasicGroupSerializer est le bon à référencer ici ?

Si tout cela est correct, le GroupShowSerializer serait-il utilisé pour l’affichage de la page de détail d’un groupe, car c’est le sérialiseur référencé dans l’action show du contrôleur ? (la page contenant les détails d’un groupe — bien qu’il ne semble pas y avoir de vue “groups.show”).

Et dans le cas où aucun sérialiseur n’est référencé, comme dans l’action new du contrôleur, que se passe-t-il alors ?

C’est en effet la raison.

Parce que ce n’est pas une méthode GET. La sérialisation concerne les grandes quantités de données répétitives sur le lien descendant.

@JQ331, jetez un coup d’œil au cœur de la configuration du routeur ici : discourse/config/routes.rb at main · discourse/discourse · GitHub

Cela vous montrera comment toutes les routes et les méthodes de contrôleur sont connectées dans l’application de base.

Pensez également à lire : Rails Routing from the Outside In — Ruby on Rails Guides

Une autre chose à noter, qui est vraiment déroutante et qui m’a beaucoup confus au début : Rails est un framework et il utilise des conventions de nommage très strictes pour faire fonctionner sa magie. Ce n’est pas immédiatement évident, lorsque vous n’y êtes pas habitué, de voir comment tout est connecté, mais lorsque vous prenez en compte les conventions de nommage, cela commence à devenir plus clair.

1 « J'aime »

Merci pour cette référence, c’est très utile. Je trouve quand même le fichier des routes un peu confus. Par exemple, autant que je puisse voir, il n’y a pas d’action de contrôleur groups#index référencée, même si c’est clairement l’action pertinente pour la page principale du groupe. Cependant, je vois l’action groups#index lorsque j’exécute :
% rails routes, ce qui est aussi, je suppose, un moyen utile de voir comment une page donnée correspond à un contrôleur.

Ne sautez pas les docs :wink:

Voici comment cela fonctionne :
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

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

C’est un moyen très concis de router un grand nombre de méthodes.

3 « J'aime »