web-dev-qa-db-ja.com

Railsでは、Stringメソッドに新しいメソッドを追加する方法は?

Railsプロジェクトでさまざまなオブジェクトのインデックスを作成し、Stringオブジェクトで呼び出すことができる 'count_occurences'メソッドを追加したいと思います。

私は次のようなことができるのを見ました

class String
  def self.count_occurences
    do_something_here
  end
end

このメソッドを定義する正確な方法と、コードをどこに置くかRailsプロジェクト?

ありがとう

49
alex

アプリケーションのlib/ext/string.rbで新しいクラスを定義し、このコンテンツをその中に配置できます。

class String
  def to_magic
    "magic"
  end
end

このクラスをロードするには、config/application.rbファイルまたは初期化子でそれを要求する必要があります。これらの拡張機能が多数ある場合は、イニシャライザーが優れています!ロードする方法は簡単です:

require 'ext/string'

to_magicメソッドは、アプリケーション/コンソール内のStringクラスのinstancesで利用可能になります。

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

プラグインは必要ありません。

93
Ryan Bigg

私はこれが古いスレッドであることを知っていますが、受け入れられた解決策がRails 4+(少なくとも私にとってはそうではありません)で動作するようには見えません。イニシャライザが機能しました。

または、/ libをRails autoloader(config/application.rbのApplicationクラスで)に追加できます。

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

require 'ext/string'

これを参照してください: http://brettu.com/Rails-Ruby-tips-203-load-lib-files-in-Rails-4/

12

コアクラスを拡張する場合、通常はプラグインを作成します(別のアプリケーションでこのコードが必要な場合に便利です)。ここでは、プラグインの作成方法のガイドを見つけることができます http://guides.rubyonrails.org/plugins.html およびポイント#3は、Stringクラスを拡張する方法を示します: http:/ /guides.rubyonrails.org/plugins.html#extending-core-classes

4