【问题标题】:Include Module Method in Nested Model Class在嵌套模型类中包含模块方法
【发布时间】:2021-01-22 17:14:11
【问题描述】:

在我的代码库的几个地方,我有一个硬编码的整数,我必须将它拉入一个方法中,以便可以在一个地方进行更改。我在lib/due_date.rb 中创建了一个模块并添加了一个方法:

module DueDate
  def due_date(days=10)
    days
  end
end

我已经将它包含在一些模型类中并且它工作正常(这些类没有嵌套)。我遇到的问题是将它包含在嵌套模型类中。例如,当模型类看起来像这样时:

module A
  module B
    class C
      include DueDate
    end
  end
end

我收到以下错误:

undefined local variable or method 'due_date' for #<Class:......>

class C 中,我首先尝试将其分配给类中其他地方使用的常量:

THRESHOLD = due_date

我尝试使用它的第二个地方是带有 where 子句的 scope

scope :range -> {
  .where("due_date <= NOW() + INTERNAL '#{due_date} days'")
}

如何将我的DueDate 模块包含在嵌套类中,以便我可以通过这两种方式使用due_date 方法?

更新: 在类中包含模块工作正常,所以我尝试使用不起作用的方法。

【问题讨论】:

  • 这应该可以。你能说明你是如何调用这个方法的吗?
  • 你并没有真正展示你在哪里使用它的完整上下文。这个常量赋值和作用域,是否在class C的实例上下文中?
  • 您仍然没有显示完整的上下文。 “在 C 类内部”不回答它是在类范围内还是在实例范围内。请记住,每个类都可以在类或实例级别进行交互。 Siim 的回答解决了这个问题。

标签: ruby ruby-on-rails-5 rspec-rails


【解决方案1】:

如果您希望该方法可用作实例方法,那么您所做的一切都是正确的。

但是,从您的示例看来,您正在尝试将其用作类方法。为此,您需要 extend 模块而不是 include 它。

module A
  module B
    class C
      extend DueDate

      THRESHOLD = due_date
    end
  end
end

A::B::C::THRESHOLD #=> 10
A::B::C.due_date #=> 10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多