0

プロジェクトのlib/にモジュールがあります。内容はこんな感じです:

module Search
  module Score

    def get_score
      return 'something'
    end

  end    
end

この検索には、スコアを使用するために必要なさまざまなモジュールがあります。モデルにrequireを追加する必要があることに気付きました(モデルからこれを使用しようとしています)。だからここに私のコード(モデル)があります:

require 'search'

class User < ActiveRecord::Base

  def get_user_score
    #tried this :
    p Search::Score.get_score #error
    #this as well
    score_instance = Score.new #error
    score = Search::Score.get_score # error undefined method `get_score'
  end

end

では、他のクラス(モジュール)にあるコードを再利用するにはどうすればよいですか?

4

5 に答える 5

2

それを機能させるには、モジュールをクラスに混在させることができます。

require 'search'

class User < ActiveRecord::Base
  include Search::Score

  def get_user_score
    p get_score # => "something"
  end
end

または、クラスメソッドと同様にモジュール内でメソッドを定義できます。

module Search
  module Score
    def self.get_score
      return 'something'
    end
  end    
end

そうすれば、get_score期待どおりに電話をかけることができます。

require 'search'

class User < ActiveRecord::Base
  def get_user_score
    p Search::Score.get_score # => "something"
  end
end

Rubyのモジュールの詳細については、このチュートリアルを参照してください。

于 2013-03-14T14:10:47.490 に答える
0

まず、「RubyonRailsのコントローラー間でコードを再利用するためのベストプラクティス」を参照してください。

モジュールとしてのコードの再利用については、「ModularityforRubyによるコードの再利用の再考」をご覧ください。

于 2013-03-14T13:56:45.210 に答える
0

Search::Scoreはモジュールであり、クラスではないため、機能しScore.newません。

get_score関数のシグネチャをに変更してみることができますself.get_score

于 2013-03-14T13:57:30.450 に答える
0

「モジュールは機能不全のクラスです」

モジュールは、Rubyの機能不全のクラスのようなものです。継承チェーンを調べると、クラスが実際にモジュールから継承していることがわかります。

モジュールをインスタンス化することはできません。したがって、.newの呼び出しは機能していません。

ただし、できることは、メソッドを「クラス」メソッドとして指定することです(クラスではないと言ったのはわかっています...)

したがって、次のように前に自己を追加します。

module Search
  module Score

    def self.get_score
      return 'something'
    end

  end    
end

次に、コード例で試したように、このメソッドをクラスメソッドとして呼び出すことができます。

于 2013-03-14T14:10:33.823 に答える
0

def self.get_score上記の回答に加えて、次のextend selfようなものもあります。

module Search
  module Score
    extend self

    def get_score
      return 'something'
    end
  end    
end

およびmodule_function

module Search
  module Score
    module_function

    def get_score
      return 'something'
    end
  end    
end

後者は実際にはRuboCop (ソース)で推奨される方法ですが、実際には私はそれほど頻繁には見たことがありません。

于 2019-06-28T13:57:18.887 に答える