2010-05-04 9 views
9

Sto tentando di riaprire la classe String nei binari e aggiungere molti altri metodi per la mia app da utilizzare. Scrivere il codice non è un problema - la mia domanda riguarda piuttosto dove questo codice dovrebbe andare.Dove riaprire una classe in RoR

Non ha senso per me riaprire una classe all'interno di un file di modello diverso, perché in realtà non ha nulla a che fare con nessuno dei modelli in particolare. Ho pensato che forse da qualche parte in config o lib avrebbe senso, ma non sono ancora particolarmente esperto di RoR.

Per riassumere, dove sarebbe il posto più logico per definire il codice di modifica della classe e ci sono implicazioni a seconda di dove/quando viene caricato il codice?

risposta

18

La posizione più logica è probabilmente in un file nella directory config/initializers. Qualsiasi file *.rb inserito qui verrà eseguito automaticamente all'avvio delle guide. Se vuoi, puoi inserirli in una sottocartella, in modo che tu possa fare qualcosa come config/initializers/extensions/*.rb.

7

Provo a mantenere queste patch per le scimmie al minimo, solo quando sono chiaramente nell'interesse del mio codice.

Ultimamente ho preferito mantenere i file organizzati in cartelle come lib/monkey/string.rb, lib/monkey/hash.rb, ecc. Quindi richiedo tutti i file nella cartella lib/monkey nel mio ambiente. file rb.

# Load all monkey-patches. 
Dir["lib/monkey/*.rb"].each {|monkeyfile| require monkeyfile} 

Questo mantiene tutta la mia classe di codice modifica isolata in un'unica posizione, in caso di problemi. Mi piace anche il nome un po 'stupido, perché lo rende evidente come qualcosa di cui essere consapevole. Qualcuno potrebbe avere un sistema migliore, se è così ... mi piacerebbe saperlo!

+2

Perché non dovresti usare la directory degli inizializzatori? Fa quello che stai facendo qui. – ryeguy

+0

Dovrò considerare l'utilizzo degli inizializzatori, ma mi sembra un po 'sbagliato fare qualcosa di così importante come modificare le classi predefinite nel percorso degli inizializzatori. – Alex

+1

Qual è la differenza? Dovresti inserire il tuo codice in un file di ambiente e verrebbe eseguito quando il framework si avvia comunque. La domanda qui è se si desidera utilizzare qualcosa incorporato in Rails o se si desidera implementare esattamente la stessa cosa. Puoi comunque creare una directory chiamata inizializzatori "scimmia" se vuoi. Non c'è bisogno di reinventare la ruota. – ryeguy