web-dev-qa-db-fra.com

Dans Rails, comment ajouter une nouvelle méthode à la classe String?

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

49
alex

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.

93
Ryan Bigg

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/

12
Christopher Davies

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

4
Ireneusz Skrobis