Estou tentando escrever meus primeiros plugins bem básicos no Discourse, depois de ler muito sobre Ruby e os benefícios que a linguagem nos oferece :)\n\nQuero adicionar texto a páginas específicas como badges, leaderboard (gamification) e edições simples semelhantes, como alterar o comportamento padrão na ordem dos resultados de busca, de último post em vez de relevância.\n\nEntendo que a melhor abordagem é evitar fazer fork do core e escrever plugins. Então, onde posso procurar se quiser alterar arquivos específicos no Discourse a partir de um plugin?\n\nPodemos pegar um exemplo editando este arquivo:\n\ndiscourse/app/models/topic_embed.rb at 5584fb1e3b7a29d7ee5d7e43520191081dd10a16 · discourse/discourse · GitHub dizer ao Discourse para usar o plugin topic_embed.rb e substituir o padrão?*
Esta é uma técnica conhecida como “monkey patching”. Existem várias maneiras de realizar isso, mas a mais fácil é simplesmente definir o método que você deseja substituir em seu plugin.
after_initialize do
class ::TopicEmbed
def self.imported_from_html(url)
# seu código
end
end
end
Bem, supomos que viemos de macacos, então, afinal, isso pode ser algo bom a fazer, seguindo seu exemplo ![]()
Obrigado pela sua resposta! Estou testando, mas o que posso fazer se quiser alterar o arquivo embed.rb inteiro?
Vejo que isso só pode ser usado para substituir uma classe específica, mas quero substituir o embed completamente, removendo os botões e mostrando um onebox simples.
Posso trabalhar no arquivo, mas não sei como colocar esse arquivo no Discourse sem fazer um fork (isso parece ser gorilla patching).
Há tanto material existente aqui. Basta olhar para todas as dezenas de plugins existentes.
Aqui está um exemplo de como substituir o sistema onebox:
Note que o patching pode ser muito direcionado e inteligente (este plugin não é particularmente! Mas isso se deve em parte à estrutura deste código principal que torna as substituições necessariamente verbosas) e a arte é fazer o mínimo possível para obter o efeito desejado: se você está propondo substituir arquivos inteiros, talvez queira repensar sua abordagem geral.
E novamente, como disse Richard, você quase nunca (pelo menos em Ruby on Rails) substitui arquivos inteiros. Você precisa pensar em métodos.