Esempio semplice per un plugin per cambiare file?

Sto cercando di scrivere i miei primi plugin molto basilari su Discourse, dopo aver letto molto su Ruby e sui vantaggi che il linguaggio ci offre :slight_smile:

Voglio aggiungere testo a pagine specifiche come badge, classifica (gamification) e modifiche semplici simili come cambiare il comportamento predefinito sull’ordine dei risultati di ricerca, ultimi post invece della rilevanza.

Capisco che l’approccio migliore sia evitare di fare fork del core e scrivere plugin. Quindi, dove posso guardare se voglio cambiare file specifici su Discourse da un plugin?

Possiamo prendere un esempio modificando questo file:

Come dire a Discourse di usare il plugin topic_embed.rb e sostituire quello predefinito?

2 Mi Piace

Questa è una tecnica nota come “monkey patching”. Ci sono diversi modi per realizzarla, ma il più semplice è definire semplicemente il metodo che si desidera sostituire nel proprio plugin.

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # il tuo codice
    end
  end
end
2 Mi Piace

Bene, si suppone che proveniamo dalle scimmie, quindi dopo tutto potrebbe essere una buona cosa da fare seguendo il tuo esempio :slight_smile:

Grazie per la tua risposta! Ci sto provando, ma cosa posso fare se voglio cambiare l’intero file embed.rb?

Vedo che può essere utilizzato solo per sostituire una classe specifica, ma voglio sostituire l’embed rimuovendo completamente i pulsanti e mostrando un semplice onebox.

Posso lavorare sul file ma non so come inserire quel file in Discourse senza fare un fork (che sembra essere “gorilla patching”).

1 Mi Piace

C’è così tanto materiale esistente qui. Guarda tutti i dozzine di plugin esistenti.

Ecco un esempio di override del sistema onebox:

Nota che il patching può essere molto mirato e intelligente (questo plugin non lo è particolarmente! Ma questo è in parte dovuto alla struttura di questo codice principale che rende gli override necessariamente verbosi) e l’arte consiste nel fare il meno possibile per ottenere l’effetto desiderato: se stai proponendo di sovrascrivere interi file, potresti voler ripensare il tuo approccio generale.

E ancora, come dice Richard, non si sovrascrivono quasi mai (almeno in Ruby on Rails) interi file. Devi pensare ai metodi.

3 Mi Piace