2011-09-20 10 views
45

Railsプロジェクト内のさまざまなオブジェクトのインデックスを作成したいと思い、Stringオブジェクトで呼び出せる 'count_occurences'メソッドを追加したいとします。 Railsでは、Stringクラスに新しいメソッドを追加する方法は?

は私が

class String 
    def self.count_occurences 
    do_something_here 
    end 
end 

何このメソッドを定義するための正確な方法だと、どこに私のRailsプロジェクトにコードを配置するような何かを行うことができましたか?あなたには、いくつかのコアクラスを拡張したい場合は

おかげ

+0

これは醜いですがどのような場合には他のライブラリにも正確に同じことをしない 'count_occurences'メソッドが追加されていますか? – arnaud576875

+0

私は何をお勧めしますか? – alex

+0

おそらく他の何かがそのメソッドを持っていないか、すでに使用していたでしょう – rogerdpack

答えて

88

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

class String 
    def to_magic 
    "magic" 
    end 
end 

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

require 'ext/string' 

to_magic方法は、

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

ませんプラグインは必要.:、インスタンスアプリケーション/コンソール内部Stringクラスのにすなわちを利用できるようになります。

+0

まさに私が必要なもの、ありがとう!ちょうど1つの質問:ファイルが "config.autoload_paths + =%W(#{config.root}/lib)"でロードされていないのはなぜですか? – alex

+2

@alex:それは可能ですが、アクセスするために使用しているサーバーやコンソールを再起動する必要があります。 'autoload_paths'オプションは、自動的にロードされるファイルを含むディレクトリを設定します。ロードされていない場合は、私が言った2つのことをやっていないと思われます。 –

+0

私は知る必要があった!どうもありがとうございます。そして、ああ、ちょうど、昨日Rails 3 in Actionを受け取りました...それを読むのが楽しみです! – alex

4

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

+0

実現可能な方法はありますか完全なプラグインを作成しなくても同じことができます(これは私が達成したいことのために多くの仕事をしています...)? – alex

+1

私はRyanが投稿した他の解決策も知っており、それも正しいです。まちがいない。しかし、私はあなたのプラグインをお勧めしました。これは私たちが弊社でやっていることなのでです。プラグインを作成するときにgithubに入れて、誰でもアプリケーションにインストールすることができます。私はこれがより多くの仕事であることを知っていますが、それは通常その価値があります。そして、私は実際にここで控除されたポイントに値すると感じていません... –

10

私はこれが古いスレッドだと知っていますが、受け入れられた解決策がRails 4+(少なくとも私のためではない)のようには見えません。拡張rbファイルをconfig/initializersに置くことができました。

代わりに、Applicationクラス内のconfig/application.rbでRailsのオートローダ(に/ libが追加できます。

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

require 'ext/string' 

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