2009-05-09 7 views
16

Railsの方法Array#to_sentence次のことが可能になります再定義Railsの方法

['a', 'b', 'c'].to_sentence # gives: "a, b, and c" 

次の(どこの人のような何かを行うことができるように、私は、それがブロックを取ることができるようにするには、この方法を拡張したいと思います

people.to_sentence { |person| person.name } 
# => "Bill, John, and Mark" 

私は拡張メソッドの作成に問題はありませんが、名前属性を持つPersonオブジェクトの配列です。しかし、私はそれをどこに置くべきかは分からない。 Railsのコア拡張は、深さがActiveSupportのどこかにロードされます。 私の必要性は、ユーザー定義コードが常にロードされ、(アプリケーションコードの前に)プリロードされている場所です。

答えて

23

作成config/initializers/super_to_sentence.rb。このディレクトリにあるすべてのファイルは、Railsがロードされた後にロードされるため、Railsの定義Array#to_sentenceをオーバーライドすることができます。

Railsがロードされる前にロードするコードについては、config/environment.rbに追加してください。

+0

このようなことが言及された場合、すべてのカスタム拡張をconfig/initializers/* .rbファイルに追加してください – cpjolicoeur

+0

ありがとうございます。それをチェックします。 – dcw

14

私はこれをしたい:

# config/initializers/app.rb 
Dir[File.join(Rails.root, "lib", "core_ext", "*.rb")].each {|l| require l } 

# lib/core_ext/array.rb 
class Array 
    def to_sentence_with_block(*args, &block) 
    if block_given? 
     # do something... 
     # to_sentence_without_block(*args) perhaps? 
    else 
     to_sentence_without_block(*args) 
    end 
    end 
    alias_method_chain :to_sentence, :block 
end 
+0

ありがとうございます。 btw、以前の定義を覚えておくこと、つまり、新しいメソッドとそのエイリアシングの定義の前に "alias old_to_sentence to_sentence"を追加することは良い方法です。 – dcw

14

私は、これは醜いアイデアだと思います。なぜ、良い練習が追加することであるように思える、あなただけの

+2

これまでのところ、これはもっと短くなります: 'people.map(&:name).to_sentence' – sawa

1

だけでウェブの周りに検索する。これは、ほぼ同じに見えると(2年間で自分自身のように)あなたのコードを読んで、他の人を混同しないだろう

people.collect { |person| person.name }.to_sentence 

を書くいけませんそれそうのlib/

であなただけのconfig/environment.rbの中で、その後.RBでコードを入れて、(私の場合、日時で)いくつかのルビークラスを拡張したい場合:

config.after_initialize do 
    require "lib/super_datetime.rb" 
    end 

私super_datetime.rbは、この(http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/140184からコード)のようになります。

class DateTime 
    def days_in_month 
    self::class.civil(year, month, -1).day 
    end 
    alias dim days_in_month 
    def weekdays 
    (1..dim).to_a 
    end 
end 
は、サーバーを再起動

、あなたはすべてのDateTimeオブジェクトのための新しい方法へのアクセス権を持っています。

関連する問題