在rails上重用代码ruby

时间:2013-03-14 13:51:54

标签: ruby-on-rails ruby

我的项目中有一个模块在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

那么如何重用我在其他类(模块)中的代码?

5 个答案:

答案 0 :(得分: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中模块的更深入解释,请参阅this tutorial

答案 1 :(得分:0)

首先,请参阅“Best Practices for reusing code between controllers in Ruby on Rails”。

关于重用代码作为模块,请查看“Rethinking code reuse with Modularity for Ruby”。

答案 2 :(得分:0)

Search::Score是一个模块,而不是一个类,因此Score.new将不起作用。

您可以尝试将get_score功能的签名更改为self.get_score

答案 3 :(得分:0)

“模块是残缺的课程”

模块就像Ruby中的残缺类。如果查看继承链,您会发现Class实际上是从Module继承的。

模块无法实例化。因此,对.new的调用无效。

你可以做的是将你的方法指定为“类”方法(我知道我说它不是一个类......)

所以你会像这样在前面添加一个自我:

module Search
  module Score

    def self.get_score
      return 'something'
    end

  end    
end

然后,您可以像在代码示例中尝试的那样将此方法称为类方法

答案 4 :(得分: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 (source)中的首选方法,尽管实际上我个人并不经常看到它。