【问题标题】:How to properly monkey patch the Numeric class on RoR?如何正确修补 RoR 上的 Numeric 类?
【发布时间】:2023-03-11 16:15:01
【问题描述】:

我想知道如何在 RoR 上正确地修补核心 DSL。我有以下猴子补丁:

# frozen_string_literal: true

module CoreExtensions
  module Numeric
    def percent_of(number)
      to_f / number * 100.0
    end
  end
end

(我已经关注了这个article)。

现在我想知道将以下内容放在哪里:

Numeric.include CoreExtensions::Numeric

我希望这个percent_of 方法可用于我的所有应用程序。我试着把它放在config/application.rb:

# frozen_string_literal: true

Rails.application.configure do
 # ...
end

Numeric.include CoreExtensions::Numeric

但它没有用。当我尝试提供以下错误时:

uninitialized constant CoreExtensions (NameError)

谢谢。

【问题讨论】:

  • 核心扩展文件的路径是什么?
  • 你可以把你的monkeypatch放在'config/initializers'目录下的一个文件中。在初始化阶段需要它。
  • 既然你没有使用细化,那么仅仅重新打开和改变类会有什么问题?为什么你需要声明一个自定义模块并包含它?
  • 要扩展@AlekseiMatiushkin 的建议,您可以使用与创建新模块相同的语法在Ruby 中“重新打开”模块:module Numeric; def percent_of(number); to_f / 数量 * 100.0;结尾;结束
  • @KeithBennett Numeric 是一个类,而不是一个模块。

标签: ruby-on-rails ruby


【解决方案1】:

正如max 评论的那样,您可以使用Rails initializers 文件夹来猴子修补库。

我建议在config/initializers/ 中创建一个新文件夹core_extensions,并将与同一模块/类相关的补丁分组到一个单独的文件中,并将include 放在last line 中。

## File path: config/initializers/core_extensions/numeric.rb

# frozen_string_literal: true

module CoreExtensions
  module Numeric
    def percent_of(number)
      to_f / number * 100.0
    end
  end
end

Numeric.include CoreExtensions::Numeric

【讨论】:

    【解决方案2】:

    我在lib/extensions/ 中创建了一个文件,并将其命名为numeric_ext.rb,内容如下:

    class Numeric
      def percent_of(number)
       to_f / number * 100.0
      end
    end
    

    之后,我将这个 sn-p 包含在我的 application.rb

    config.to_prepare do
      load 'extensions/numeric_ext.rb'
    end
    

    我对此进行了测试,它工作正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多