JQ331
2020 年6 月 2 日 19:17
1
我认为这个问题涉及到了 Rails 的细节,但还是说说看:
我正在尝试弄清楚如何在群组索引页面上显示每个群组的拥有者(相当于这个页面 )。
我的出发点是群组模型 ,这暗示我群组的拥有者特性并不是直接附加在群组上的(与比如“full_name”不同,我可以看到它是该链接底部群组架构的一部分)。
因此很明显,我不能像调用 group.full_name 那样调用 group.owners。同样,我认为通过检索群组信息也无法从 API 获取该信息,因为“owners”似乎不是返回的值之一。
我该如何获取群组的拥有者信息以显示出来?
tshenry
(Taylor)
2020 年6 月 3 日 00:34
2
我不太清楚您具体想实现什么,但我想您要找的是 GroupUser 。您可以使用类似下面的代码来获取群组 ID 及其所有者的用户 ID 列表:
GroupUser.where(owner: true).pluck("group_id", "user_id")
5 个赞
JQ331
2020 年6 月 3 日 00:51
3
谢谢,这确实是一个进步。我的目标是在群组索引页的群组名称下方显示群组的拥有者。
编辑:例如,像这样:
<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 个赞
tshenry
(Taylor)
2020 年6 月 4 日 01:29
4
你需要编写一个小插件来序列化正确的信息。我看到了你在 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 个赞
JQ331
2020 年6 月 4 日 01:44
5
这非常有帮助——谢谢。明白您无法提供进一步的代码帮助,但我希望能提出两个通用问题,相信其他人也会觉得有用:
–能否简要说明一下为什么这里需要序列化器?(我不仅想了解这个案例,也想理解其他自定义场景)
另外还有一个小问题:我能否仅在仪表板中实现这一功能?(当然,创建插件会更规范,但由于我使用的是托管计划,无法直接导入新插件——至少需要多走几步流程)
1 个赞
tshenry
(Taylor)
2020 年6 月 4 日 02:14
6
当然可以 默认情况下,数据并未通过 BasicGroupSerializer 暴露出来。我们只包含必要的部分。
追踪起来有点像走迷宫,但 groups-info 组件之所以能拥有当前可用的数据,仅仅是因为它从父模板接收了 group 对象:
而父模板的数据则来自控制器:
JQ331:
我能否仅在我的仪表板中实现这一点?
恐怕不行。除非有什么我不知道的“魔法”!
2 个赞
JQ331
2020 年6 月 5 日 14:51
8
编辑:在意识到我提出的问题更适合单独发帖后,已移至此处 。
JQ331
2020 年6 月 30 日 16:09
9
你好 @tshenry ,我正在尝试开发一个插件,其中包含类似你上面提供的用于公开群组所有者的代码。我有一个问题想请教:
– 这里相关的模型是 “group”(它在 groups-info 中被引用)
– 但在序列化器中,你并没有写:add_to_serializer(:group, :owners)… 相反,你没有引用 :group,而是引用了 :basic_group,例如:
add_to_serializer(:basic_group, :owners)
为什么在 add_to_serializer 中你引用的是 basic_group 而不是 group?
JQ331
2020 年6 月 30 日 16:26
11
你是如何确定该序列化器适用于此场景的?
根据我的理解:在 groups 控制器 的 index 操作中,有一个 render_json_dump 函数(或方法),它在 serialize_data 调用中包含了 BasicGroupSerializer。
显示群组数据的相应页面是 群组列表页 ,因此此处应查看控制器中的 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 是一个框架,它使用一些非常严格的命名约定来实现其“魔法”。当你不熟悉时,并不清楚所有部分是如何连接的,但一旦考虑到这些命名约定,一切就会变得清晰起来。
1 个赞
JQ331
2020 年6 月 30 日 16:46
14
感谢这个参考链接——非常有用。不过我觉得路由文件有点令人困惑。例如,据我所见,并没有引用 groups#index 控制器操作,尽管这显然是主群组获取页面相关的操作。不过,当我运行以下命令时,确实看到了 groups#index 操作:
% rails routes,我想这也是查看给定页面如何对应控制器的一种有用方式。