2

所以,我已经阅读了所有内容:

但我不能让它工作。这是我的情况:

我的模型有一个calc_distance(place1, place2)方法和一个属性placesUser我想calc_total_distanceUser模型中定义一个方法。

我想calc_distance通过一个库访问该方法,Utils而不是在使用它时加载整个实用程序。

/lib/utils.rb

module Utils
  def calc_distance a, b
    # Blah blah blah
  end
end

/config/application.rb我有:

config.autoload_paths += %W(#{config.root}/lib)

在控制台中,我可以这样做 include Utils并且calc_distance(place1, place2)它可以工作。但Utils::calc_distance(place1 place2)不起作用...

额外的问题是我可以这样做吗?

然后在我的User.rb模型中:

  def get_total_distance
    # Blah blah blah
    dist += calc_distance(place1, place2)
    # Blah blah blah
  end

还给我undefined method 'include' for #<User:0x00000006368278>

  def get_total_distance
    # Blah blah blah
    dist += Utils::calc_distance(place1, place2)
    # Blah blah blah
  end

还给我undefined method 'calc_distance' for Utils:Module

我怎么能做到这一点,知道我真的更喜欢第二种方法(据我估计,它不会加载整个 Utils 模块......

4

2 回答 2

3

如果你不想做 mixin,而只是定义一些 Utils 的方法,那么你可以在模块级别定义方法(使用 self.prefix):

module Utils
  def self.calc_distance a, b
    # Blah blah blah
  end
end

然后这样称呼他们:

Utils.calc_distance(place1, place2)

代替

Utils::calc_distance(place1, place2)
于 2015-10-26T15:31:06.070 回答
0
class Athlete < ActiveRecord::Base
  include Utils
  def get_total_distance
    # Blah blah blah
    dist += calc_distance(place1, place2)
    # Blah blah blah
  end
end
于 2013-08-08T11:26:26.227 回答