グループの所有者を取得する方法は?(Rails のコードに関する質問)

この質問は Rails の詳細な部分に触れるものかもしれませんが、以下に説明します。

各グループの所有者(または所有者たち)をグループ一覧ページ(このページ と同等)に表示する方法を模索しています。

出発点はグループモデルです。これによると、グループの所有者という特性は、グループに直接関連付けられていないようです(例えば、同リンクの下部にあるグループスキーマの一部として確認できる full_name とは異なります)。

したがって、group.full_name のように group.owners を呼び出すことはできないことは明らかです。同様に、グループに関する情報を取得して API から情報を得ることもできないと思います。なぜなら、「owners」は返される値のリストに含まれていないように見えるからです。

では、グループの所有者を取得してその情報を表示するにはどうすればよいでしょうか?

何を達成しようとしているのかは完全にはわかりませんが、GroupUser をお探しのようです。以下のようにして、グループ ID とその所有者のユーザー ID のリストを取得できます。

GroupUser.where(owner: true).pluck("group_id", "user_id")
「いいね!」 5

ありがとうございます、これは確かに前進です。私の目標は、グループ一覧ページでグループ名の下にグループの所有者を表示することです。

編集:例えば、以下のような感じです:

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

これは完全に機能しません。何が不足していますか?

「いいね!」 1

正しい情報をシリアライズするための小さなプラグインを作成する必要があります。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>

これらすべてを組み合わせて、サイト設定でプラグインを有効にすれば、グループページにグループ所有者のユーザー ID が表示されるはずです。

それ以上のサポートはできませんが、幸運を祈ります!

「いいね!」 6

これは非常に助かりました。ありがとうございます。さらにコードのサポートは提供できないことは理解していますが、他の人にも役立つかもしれないので、2 つの一般的な質問をさせてください。

–なぜここでシリアライザーが必要なのか、簡単に説明いただけますか?(このケースだけでなく、他のカスタマイズも理解したいと考えています)

それと、もう一つ簡単な質問ですが、これはダッシュボードだけで実現できるでしょうか?(プラグインを作成する方が確かに整理されますが、ホストプランを利用しているため、新しいプラグインを直接インポートすることができません。少なくとも数ステップ余計にかかります)

「いいね!」 1

もちろん :slight_smile: データはデフォルトでは BasicGroupSerializer によって公開されていません。必要なものだけを含まれています。

たどるのは少し複雑ですが、groups-info コンポーネントが持っているデータが利用可能なのは、親テンプレートから group が渡されているからです。

そして、その親テンプレートはコントローラーからデータを取得しています。

残念ながら、それはできません。私が知らない何か魔法のような方法があるのかもしれませんが!

「いいね!」 2

素晴らしいです。このような役立つ情報をいただき、誠にありがとうございます。

「いいね!」 1

編集:私が質問した内容が別のトピックの方が適切だと気づいたため、こちら に移動しました。

@tshenry さん、こんにちは。上記で示されたコードを含み、グループのオーナーを公開するプラグインを実装しようとしています。一つ確認したい点があります。

– ここでの関連モデルは「group」です(groups-info で参照されています)。
– しかし、シリアライザーでは add_to_serializer(:group, :owners) のように「group」を参照するのではなく、:basic_group を参照しています。

add_to_serializer で「group」ではなく「basic_group」を参照する理由は何でしょうか?

それは、この場合のシリアライザーの名前が ‘basic_group’ であるためです:discourse/app/serializers/basic_group_serializer.rb at main · discourse/discourse · GitHub

「いいね!」 3

このケースにおいて、なぜそのシリアライザーが適切だと判断したのですか?

私が把握している限りでは、groups controllerindex アクションには、serialize_data 呼び出しで BasicGroupSerializer を含む render_json_dump 関数(またはメソッド)があります。

グループデータを表示する関連ページは groups index なので、ここではコントローラーの index アクションが適切な対象となります。

つまり、BasicGroupSerializer がここで参照すべき正しいシリアライザーだと判断する根拠は、そのような仕組みに基づいているのでしょうか?

もし上記がすべて正しいなら、グループの詳細ページ(「groups.show」ビューは存在しないようですが)を表示する際には、コントローラーの show アクションで参照されている GroupShowSerializer が使用されるのでしょうか?

そして、コントローラーの new アクションのように、シリアライザーが参照されていない場合はどうなるのでしょうか?

これがまさにその理由です。

それは GET メソッドではないからです。シリアライゼーションは、ダウンリンクにおける大量の反復データのためのものです。

@JQ331 以下のルーター設定の核心部分をご覧ください:discourse/config/routes.rb at main · discourse/discourse · GitHub

これにより、ベースアプリケーションでどのようにすべてのルートとコントローラーメソッドが接続されているかがわかります。

また、以下も参照することをお勧めします:Rails Routing from the Outside In — Ruby on Rails Guides

もう一点、非常に混乱しやすく、私も当初は大きく混乱した点があります。Rails はフレームワークであり、その魔法を機能させるために非常に厳格な命名規則を使用しています。慣れるまでは、すべてがどのように接続されているかが明確ではありませんが、命名規則を考慮に入れると、次第に理解しやすくなります。

「いいね!」 1

参考資料をありがとうございます。非常に役立ちました。ただ、routes ファイルは少し混乱を招くと感じています。例えば、私の確認範囲では、メインのグループ取得ページに関連するアクションである groups#index コントローラーアクションが参照されていないようです。しかし、rails routesを実行すると groups#index アクションが表示されます。これは、特定のページがどのコントローラーに対応しているかを確認する便利な方法のようです。

ドキュメントは省略しないでください :wink:

仕組みは以下の通りです:
discourse/config/routes.rb at 57a8b3b964f867818c4dbfe394b762c0a286c28d · discourse/discourse · GitHub

参照: Rails Routing from the Outside In — Ruby on Rails Guides

これは、多くのメソッドを非常に簡潔にルーティングする方法です。

「いいね!」 3