【问题标题】:Rails - Accessing module method in modelRails - 访问模型中的模块方法
【发布时间】:2013-08-08 10:47:37
【问题描述】:

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

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

我的User 模型有一个calc_distance(place1, place2) 方法和一个属性places,我想在User 模型中定义一个方法calc_total_distance

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

/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 模块...

【问题讨论】:

  • 你可以试试include Utils到user.rb吗?

标签: ruby-on-rails-3 module


【解决方案1】:

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

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

然后这样称呼他们:

Utils.calc_distance(place1, place2)

而不是

Utils::calc_distance(place1, place2)

【讨论】:

    【解决方案2】:
    class Athlete < ActiveRecord::Base
      include Utils
      def get_total_distance
        # Blah blah blah
        dist += calc_distance(place1, place2)
        # Blah blah blah
      end
    end
    

    【讨论】:

    • 所以我会选择第一个解决方案。没有做 Utils::calc_distance 的解决方案?我是不是加载了太多方法而不是只加载了我需要的一个?
    • 不,你不能只加载模块的一种方法。如果你想这样,你必须用特定的方法创建不同的模块
    • 好的,那么什么时候我应该使用Module::method 作为语法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2014-08-29
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多