1

つまり、モジュールをインクルードするクラスで使用されるクラス メソッドをモジュールに作成したいと考えています。それらは別々のファイルにあります。

これまでのところ、私は次のようなものを持っています:

module Base
  def self.all
    puts "All Users"
  end
end

class User
  include Base
end

しかし、私は取得しています: NoMethodError: undefined methodall' for User:Class`

問題を説明してもらえますか?私がやっていることは悪い慣行であるか、何らかの原則に反していますか?

4

2 に答える 2

3

クラスでモジュールを使用できextendます。コードは次のようになります。

module Base
  def all
    puts "All Users"
  end
end

class User
  extend Base
end

このようなことをすると:

module MyModule
  def self.module_method
    puts "module!"
  end
end

実際にはモジュール自体にメソッドを追加しています。次のように前のメソッドを呼び出すことができます。

MyModule.module_method

を含めて、必要な動作を取得する方法がありますが、moduleこれが「進むべき道」と見なされるとは思いません。例を見てください:

module Base
  def self.included(klass)
    def klass.all
      puts "all users"
    end
  end
end

class User
  include Base
end

しかし、私が言ったように、extendクラスメソッドを使用できる場合は、それがより適しています。

于 2013-02-13T20:50:17.890 に答える
0

Ricardo の回答に続いて、Ruby プログラマーの間で一般的なイディオムを検討してください。モジュールのクラス メソッドを ClassMethods と呼ばれる内部モジュールに囲み (それは一口です)、Module#included フックを使用して ClassMethods モジュールで基本クラスを拡張します。

詳細はこちら: http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/

于 2013-02-13T20:55:24.400 に答える