Je veux construire un index pour différents objets dans mon projet Rails et je voudrais ajouter une méthode 'count_occurences' que je peux appeler sur des objets String.
J'ai vu que je pouvais faire quelque chose comme
class String
def self.count_occurences
do_something_here
end
end
Quelle est la manière exacte de définir cette méthode et où placer le code dans mon projet Rails?
Merci
Vous pouvez définir une nouvelle classe dans votre application à lib/ext/string.rb
et y mettre ce contenu:
class String
def to_magic
"magic"
end
end
Pour charger cette classe, vous devrez l'exiger dans votre config/application.rb
fichier ou dans un initialiseur. Si vous aviez plusieurs de ces extensions, un initialiseur est mieux! La façon de le charger est simple:
require 'ext/string'
Le to_magic
sera alors disponible sur instances de la classe String
dans votre application/console, c'est-à-dire:
>> "not magic".to_magic
=> "magic"
Aucun plugin nécessaire.
Je sais que c'est un vieux fil, mais il ne semble pas que la solution acceptée fonctionne en Rails 4+ (du moins pas pour moi). Mettre le fichier d'extension rb dans config/les initialiseurs ont fonctionné.
Alternativement, vous pouvez ajouter/lib à l'autoloader Rails (dans config/application.rb, dans la classe Application:
config.autoload_paths += %W(#{config.root}/lib)
require 'ext/string'
Voir ceci: http://brettu.com/Rails-Ruby-tips-203-load-lib-files-in-Rails-4/
Lorsque vous souhaitez étendre une classe de base, vous devez généralement créer un plugin (c'est pratique lorsque vous avez besoin de ce code dans une autre application). Ici vous pouvez trouver un guide pour créer un plugin http://guides.rubyonrails.org/plugins.html et le point # 3 vous montre comment étendre la classe String: http://guides.rubyonrails.org/plugins.html#extending-core-classes