2011-09-20 19 views
45

Voglio costruire un indice per oggetti diversi nel mio progetto Rails e vorrei aggiungere un metodo 'count_occurences' che posso chiamare su oggetti String.In Rails, come aggiungere un nuovo metodo alla classe String?

ho visto che potevo fare qualcosa di simile

class String 
    def self.count_occurences 
    do_something_here 
    end 
end 

Qual è il modo esatto per definire questo metodo, e dove mettere il codice nel mio progetto Rails?

Grazie

+0

Questo è brutto Che cosa succede se un un'altra libreria aggiunge anche un metodo 'count_occurences' che non fa esattamente la stessa cosa? – arnaud576875

+0

Quindi cosa suggerisci di fare? – alex

+0

presumibilmente qualcos'altro non ha quel metodo o lo avrebbe già usato – rogerdpack

risposta

88

È possibile definire una nuova classe nell'applicazione a lib/ext/string.rb e mettere questi contenuti in esso:

class String 
    def to_magic 
    "magic" 
    end 
end 

Per caricare questa classe, è necessario richiederla nel file config/application.rb o in un inizializzatore. Se avessi molte di queste estensioni, un inizializzatore è migliore! Il modo per caricarlo è semplice:

require 'ext/string' 

Il metodo to_magic sarà quindi disponibile sul casi della classe String all'interno della vostra applicazione/console, cioè .:

>> "not magic".to_magic 
=> "magic" 

Nessun plugin necessario.

+0

Esattamente quello di cui avevo bisogno, grazie! Solo una domanda: perché il file non è stato caricato con "config.autoload_paths + =% W (# {config.root}/lib)"? – alex

+2

@alex: Sarebbe, ma avresti bisogno di riavviare il tuo server o console, a seconda di cosa stai usando per accedervi. L'opzione 'autoload_paths' configura le directory contenenti i file che verranno caricati automaticamente, e quindi se * non * viene caricato sospetto che tu non abbia fatto di quelle due cose che ho appena detto. –

+0

ok. tutto quello che dovevo sapere! grazie mille. e, oh, a proposito, ho appena ricevuto Rails 3 in Action ieri ... non vedo l'ora di leggerlo! – alex

4

Quando si desidera estendere un po 'di classe principale, allora di solito si desidera creare un plugin (è utile quando hanno bisogno di questo codice in un'altra applicazione). Qui si può trovare una guida su come creare un plugin http://guides.rubyonrails.org/plugins.html e punto # 3 mostrano come estendere classe String: http://guides.rubyonrails.org/plugins.html#extending-core-classes

+0

C'è un modo che posso realizzare la stessa cosa senza dover creare un plugin completo (che sembra molto lavoro per quello che voglio realizzare ...)? – alex

+1

Conosco l'altra soluzione che Ryan pubblica ed è anche corretta. Nessun dubbio a riguardo. Ma ti ho consigliato plug-in perché questo è ciò che facciamo nella nostra azienda. Quando crei un plugin puoi metterlo su github e chiunque può installarlo nella sua applicazione. So che questo è più lavoro ma di solito ne vale la pena. E davvero non credo di aver meritato il punto dedotto qui ... –

10

So che questo è un thread vecchio, ma non sembra che la soluzione accettata funzioni in Rails 4+ (almeno non per me). Mettendo l'estensione del file rb in config/inizializzatori funzionanti.

In alternativa, è possibile aggiungere/lib al caricatore automatico Rails (in config/application.rb, nella classe di applicazione:

config.autoload_paths += %W(#{config.root}/lib) 

require 'ext/string' 

vedere questo:. http://brettu.com/rails-ruby-tips-203-load-lib-files-in-rails-4/

Problemi correlati