0

コア配列クラスを単純なメソッドで拡張したい:

class Array
  def to_hash
    result = Hash.new
    self.each { |a| result[a] = '' }
    result
  end
end

array.rbをlib/core_extに入れ、application.rbでそれを要求しようとしました。

config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]

しかしundefined method 'to_hash' for ["var1", "var2", "var3"]:Array、モデルメソッドで使用しようとすると、それでも取得できます。もちろん、コードを変更した後、サーバーを再起動しました。

4

1 に答える 1

2

これを行うには、次のいずれかのファイルに次を追加します。config/initializers

require 'core_ext/array`

構成値が行うことは、autoload_pathsクラス/ファイルが要求されたときにパスを利用できるようにすることだけです。私のアプリでは、次のようなファイル構造があるかもしれません

- lib/
  |
  |- deefour.rb
  |- deefour/
     |
     |- core_ext.rb

私のdeefour.rb中で私は持っています

require 'deefour/core_ext'

内部config/initializersには、deefour.rb単に含むファイルがあります

require 'deefour'

設定した autoload 構成値によって Rails が自動ロードのように見える唯一の方法は、そのファイルに存在lib/deefour/core_ext.rbするクラスへの呼び出しがあった場合です。これが、イニシャライザのDeefour::CoreExt私の行がファイルを自動ロードすることを知っている理由です。require 'deefour'lib/deefour.rb

明示的なrequire 'deefour/core_ext'inlib/deefour.rbも、Ruby/Rails が期待する標準のクラス名からディレクトリへのマッピングに従わないため、同じ目的を果たします。

于 2012-11-27T21:49:56.033 に答える