# Esempio semplice per un plugin per cambiare file?

**URL:** https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206
**Category:** Development
**Created:** [30 Giugno 2023, 9:40pm UTC](https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206 "2023-06-30T21:40:07Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![satonotdead](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/satonotdead/32/447830_2.png) [@satonotdead](https://meta.discourse.org/u/satonotdead)
#### Post date: [30 Giugno 2023, 9:40pm UTC](https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206/1 "2023-06-30T21:40:08Z")

</div>

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 🙂

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:

> <https://github.com/discourse/discourse/blob/5584fb1e3b7a29d7ee5d7e43520191081dd10a16/app/models/topic_embed.rb#L38>

_Come dire a Discourse di usare il plugin `topic_embed.rb` e sostituire quello predefinito?_

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [30 Giugno 2023, 9:52pm UTC](https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206/2 "2023-06-30T21:52:30Z")

</div>

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.

```rb
after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # il tuo codice
    end
  end
end

```

---

<div class="post-metadata">

### Author: ![satonotdead](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/satonotdead/32/447830_2.png) [@satonotdead](https://meta.discourse.org/u/satonotdead)
#### Post date: [30 Giugno 2023, 10:53pm UTC](https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206/3 "2023-06-30T22:53:51Z")

</div>

> [@RGJ](#):
>
> Questa è una tecnica nota come “monkey patching”.

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

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

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [1 Luglio 2023, 5:57am UTC](https://meta.discourse.org/t/simple-example-for-plugin-to-change-files/270206/4 "2023-07-01T05:57:24Z")

</div>

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

Ecco un esempio di override del sistema onebox:

> <https://github.com/merefield/discourse-onebox-assistant/blob/master/plugin.rb>

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.
