Acabei de passar por esse processo e enfrentei bastante tentativa e erro, então decidi documentar minhas descobertas para ajudar o próximo desenvolvedor que passar por aqui.
O que eu precisava:
-
Registrar seu tipo de campo personalizado (o meu era booleano, o padrão é string)
# plugin.rb User.register_custom_field_type 'my_preference', :boolean -
Registrar que o campo personalizado deve ser editável pelos usuários. A sintaxe corresponde à de
params.permit(...)
# plugin.rb register_editable_user_custom_field :my_preference # Tipo escalar (string, integer, etc.) register_editable_user_custom_field [:my_preference , my_preference : []] # Para tipo array register_editable_user_custom_field [:my_preference, my_preference : {}] # para tipo json -
Adicioná-los aos campos serializados com o CurrentUserSerializer
# plugin.rb DiscoursePluginRegistry.serialized_current_user_fields << 'my_preference' -
Criar um componente para exibir sua preferência de usuário
// assets/javascripts/discourse/templates/components/my-preference.hbs <label class="control-label">Minhas preferências personalizadas!</label> {{preference-checkbox labelKey="my_plugin.preferences.key" checked=user.custom_fields.my_preference}} -
Conectar esse componente a um dos outlets de plugin de preferências (o meu estava em ‘interface’ nas preferências do usuário)
# assets/javascripts/discourse/connectors/user-preferences-interface/my-preference.hbs {{my-preference user=model}} -
Garantir que os ‘campos personalizados’ sejam salvos na aba de preferências
import { withPluginApi } from 'discourse/lib/plugin-api' export default { name: 'post-read-email', initialize () { withPluginApi('0.8.22', api => { api.modifyClass('controller:preferences/emails', { actions: { save () { this.get('saveAttrNames').push('custom_fields') this._super() } } }) }) } }
Este documento está sob controle de versão - sugira alterações no github.
of course. Just add another. It’s been a long day. Thanks!