Я думаю, что этот вопрос углубляется в детали Rails, но попробую:
Я пытаюсь разобраться, как отображать владельца или владельцев каждой группы на странице списка групп (аналогично этой странице).
Моя отправная точка — модель группы, которая, как мне кажется, подразумевает, что признак владельцев группы не привязан напрямую к группе (в отличие, скажем, от “full_name”, который, как я вижу, является частью схемы группы в конце этой ссылки).
Таким образом, очевидно, что я не могу вызвать group.owners так, как могу вызвать group.full_name. Аналогично, я не думаю, что смогу получить эту информацию через API, просто запросив данные о группе, поскольку “owners” не кажется одним из возвращаемых значений.
Как мне получить список владельцев группы, чтобы отобразить эту информацию?
Мне не совсем понятно, чего именно вы пытаетесь достичь, но, кажется, вам нужен GroupUser. Вы можете получить список идентификаторов групп и идентификаторов пользователей их владельцев с помощью чего-то вроде:
Я набросал кое-что в качестве очень грубого доказательства концепции, которое может послужить отправной точкой для самостоятельного разбирательства:
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
Если собрать всё это вместе и включить плагин в настройках сайта, вы должны увидеть на странице групп списки идентификаторов пользователей, являющихся владельцами групп.
Это чрезвычайно полезно — спасибо. Понимаю, что вы не можете предоставить дополнительную помощь с кодом, но надеюсь, смогу задать два общих вопроса, которые могут быть полезны и другим:
— Можете ли вы кратко объяснить, почему здесь необходим сериализатор? (Пытаюсь понять это не только в данном случае, но и для других кастомизаций)
И ещё один быстрый вопрос: могу ли я добиться этого прямо в своей панели управления? (Создание плагина, безусловно, было бы более организованным решением, но так как я использую хостинговый тариф, я не могу напрямую импортировать новые плагины — это требует как минимум нескольких дополнительных шагов)
Конечно Данные по умолчанию не доступны через BasicGroupSerializer. Мы включаем только то, что необходимо.
Проследить за этим немного запутанно, но единственная причина, по которой компонент groups-info имеет доступ к тем данным, которые у него есть, заключается в том, что он получает объект group от своего родительского шаблона:
А родительский шаблон получает его от контроллера:
Боюсь, что нет. Если только я не знаю о какой-то магии!
Привет @tshenry, я пытаюсь запустить плагин, который включает код, похожий на тот, что вы привели выше, для раскрытия информации о владельце группы. У меня возник один вопрос, который я пытаюсь прояснить:
— Соответствующая модель здесь — «group» (на которую ссылается groups-info).
— Но в сериализаторе вы не пишете: add_to_serializer(:group, :owners)… Вместо ссылки на :group вы ссылаетесь на :basic_group, например:
add_to_serializer(:basic_group, :owners)
Почему вы ссылаетесь на basic_group, а не на group, в add_to_serializer?
Как вы определили, что именно этот сериализатор подходит для данного случая?
Вот что мне удалось выяснить: в контроллере групп, в действии index, есть функция (или метод) render_json_dump, которая включает BasicGroupSerializer в вызов serialize_data.
Соответствующая страница для отображения данных о группах — это индекс групп, поэтому именно действие index в контроллере здесь нужно рассматривать.
Именно так вы поняли, что BasicGroupSerializer — это правильный сериализатор, на который нужно ссылаться?
Если всё верно, то используется ли GroupShowSerializer для отображения страницы отдельной группы, поскольку именно этот сериализатор указан в действии show контроллера? (страница с деталями группы — хотя, похоже, представления groups.show нет).
А что в случае, если сериализатор не указан, например, в действии new контроллера?
Ещё один момент, который может сбить с толку и который меня самого сильно запутывал в начале: Rails — это фреймворк, и для реализации своей магии он использует очень строгие соглашения об именовании. Если вы к этому не привыкли, не сразу понятно, как всё связано между собой, но если учесть соглашения об именовании, картина начинает проясняться.
Спасибо за эту ссылку — очень полезно. Мне сам файл маршрутов кажется немного запутанным. Например, насколько я вижу, в нём нет ссылки на действие контроллера groups#index, хотя именно это действие явно отвечает за основную страницу группы. Однако я вижу действие groups#index, когда запускаю:
% rails routes, что, думаю, тоже удобный способ понять, какой странице соответствует контроллер.