Come recuperare i proprietari del gruppo? (Domanda su codice Rails)

Penso che questa domanda entri nel dettaglio tecnico di Rails, ma eccomi:

Sto cercando di capire come visualizzare il proprietario o i proprietari di ogni gruppo nella pagina dell’indice dei gruppi (equivalente a questa pagina).

Il mio punto di partenza è il modello di gruppo, che mi fa capire che la caratteristica dei proprietari del gruppo non è collegata direttamente a un gruppo (a differenza, ad esempio, di “full_name”, che vedo essere parte dello schema del gruppo in fondo a quel link).

Quindi è chiaro che non posso chiamare group.owners come posso chiamare group.full_name. Allo stesso modo, non credo di poter ottenere le informazioni dall’API recuperando i dati di un gruppo, poiché “owners” non sembra essere uno dei valori restituiti.

Come potrei recuperare i proprietari di un gruppo per visualizzare tali informazioni?

Non sono del tutto chiaro su cosa tu stia cercando di ottenere, ma credo che tu stia cercando GroupUser. Puoi ottenere un elenco di group_id e gli user_id dei rispettivi proprietari utilizzando qualcosa come:

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

Grazie, questo è sicuramente un passo avanti. Il mio obiettivo è visualizzare i proprietari di un gruppo sotto il nome del gruppo nella pagina dell’indice dei gruppi.

MODIFICA: Ad esempio, qualcosa del genere:

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

Questo non funziona del tutto. Cosa manca?

Dovrai scrivere un piccolo plugin per serializzare le informazioni corrette. Ho visto il tuo post su Marketplace. Spero che qualcuno si faccia avanti!

Se vuoi iniziare a esplorare seriamente i plugin, potresti dare un’occhiata a Learn how to start building stuff for Discourse if you're newbie (like myself)

Ho messo insieme qualcosa come una prova di concetto molto grezza che potrebbe darti un punto di partenza per capire come procedere da solo:

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

Nella scheda </head> di un tema

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

Se metti tutto insieme e abiliti il plugin nelle impostazioni del sito, dovresti vedere gli ID utente dei proprietari del gruppo elencati nella pagina dei gruppi.

Non potrò aiutarti oltre, quindi in bocca al lupo!

Questo è estremamente utile, grazie. Ho capito che non sei in grado di fornire ulteriore aiuto con il codice, ma spero di poter fare due domande generali che potrebbero essere utili anche ad altri:

–Puoi spiegare brevemente perché è necessario un serializzatore in questo caso? (sto cercando di capire non solo per questo, ma anche per altre personalizzazioni)

E solo una domanda veloce: potrei ottenere questo risultato direttamente nella mia dashboard? (creare un plugin sarebbe sicuramente più organizzato, ma dato che sono su un piano ospitato, non posso importare direttamente nuovi plugin; richiede almeno qualche passaggio in più)

Certo :slight_smile: I dati non sono esposti di default nel BasicGroupSerializer. Includiamo solo ciò che ci serve.

È un po’ un labirinto da seguire, ma l’unico motivo per cui il componente groups-info ha a disposizione ciò che ha è perché riceve group dal suo template genitore:

E il template genitore lo ottiene dal controller:

Mi dispiace, ma non credo sia possibile. A meno che non ci sia qualche magia di cui non sono a conoscenza!

Fantastico. Grazie mille per queste informazioni utili.

Modifica: spostato qui dopo aver realizzato che la domanda che ho posto è più appropriata per un argomento separato.

Ciao @tshenry, sto cercando di configurare un plugin che includa un codice simile a quello che hai fornito sopra per esporre il proprietario del gruppo. Ho una domanda su cui sto ragionando:

–il modello rilevante qui è “group” (che è referenziato da groups-info)
–ma nel serializer, non scrivi: add_to_serializer(:group, :owners)… Invece di referenziare :group, fai riferimento a :basic_group, come:

add_to_serializer(:basic_group, :owners)

Perché fai riferimento a basic_group invece di group in add_to_serializer?

È perché ‘basic_group’ è il nome del serializzatore in questo caso: discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

Come hai identificato che quello serializer fosse quello giusto per questo caso?

Ecco quello che ho capito: nel controller dei gruppi, nell’azione index, c’è una funzione (o metodo) render_json_dump che include il BasicGroupSerializer nella chiamata serialize_data.

La pagina rilevante per visualizzare i dati dei gruppi è l’indice dei gruppi, quindi l’azione index nel controller è quella giusta da esaminare qui.

È così che sai che il BasicGroupSerializer è quello corretto da utilizzare in questo contesto?

Se tutto ciò è corretto, allora il GroupShowSerializer verrebbe utilizzato per la visualizzazione della pagina di dettaglio del gruppo, poiché è lo serializer riferito nell’azione show del controller? (la pagina con i dettagli di un gruppo, anche se non sembra esserci una vista “groups.show”).

E cosa succede se non c’è alcun serializer riferito, come nell’azione new del controller?

Questo è effettivamente il motivo.

Perché non si tratta di un metodo GET. La serializzazione serve per le grandi quantità di dati ripetitivi sul canale di downlink.

@JQ331 dai un’occhiata al cuore della configurazione del router qui: discourse/config/routes.rb at main · discourse/discourse · GitHub

Questo ti mostrerà come tutte le rotte e i metodi dei controller sono collegati nell’applicazione di base.

Considera anche la lettura di: Rails Routing from the Outside In — Ruby on Rails Guides

Un’ulteriore cosa da notare, che è davvero confusa e che mi ha confuso molto all’inizio: Rails è un framework e utilizza convenzioni di denominazione molto rigide per far funzionare alcune delle sue magie. Non è immediatamente chiaro, quando non ci si è abituati, come tutto venga collegato, ma tenendo conto delle convenzioni di denominazione inizia a diventare più chiaro.

Grazie per quel riferimento, molto utile. Trovo un po’ confuso il file delle rotte. Ad esempio, per quanto riesco a vedere, non c’è alcun riferimento all’azione del controller groups#index, anche se è chiaramente l’azione rilevante per la pagina principale del gruppo. Tuttavia, vedo l’azione groups#index quando eseguo:
% rails routes, che immagino sia anche un modo utile per vedere come una determinata pagina corrisponde a un controller.

Non saltare la documentazione :wink:

Ecco come funziona:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

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

Questo è un modo molto sintetico per instradare molti metodi.