Exemplo simples para plugin mudar arquivos?

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

2 curtidas

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

Bem, supomos que viemos de macacos, então, afinal, isso pode ser algo bom a fazer, seguindo seu exemplo :slight_smile:

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

1 curtida

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.

3 curtidas