如何要求宝石上已经存在的模块?猴子修补

时间:2017-04-17 00:49:16

标签: ruby-on-rails ruby

我正在使用telegram-bot宝石。它有一个名为Telegram的模块。我想扩展它以添加一个方法作为我最常见的调用的快捷方式。

我要创建的方法是Telegram.send_message(text),使用我的默认配置。

为此,我在telegram.rb上添加了一个扩展原始模块的app/models/telegram.rb文件:

 module Telegram
    def self.send_message(text, options={})
        #...
    end
 end

如果在控制台上运行Telegram.send_message,它会显示未定义的方法。如果我require 'telegram' send_message方法现在有效,(我猜它不会自动加载,因为已经有一个名为Telegram的模块(宝石上的那个)。现在我想要它应用初始化,

我首先尝试的是在我的application.rb上添加需求,但它显示cannot load such file,因为,我认为load_path尚未包含app/models

我可以在哪里添加要求?

另一种选择是给它另一个名字,比如TelegramBot。但我不喜欢TelegramTelegramBot

的想法

其他替代方案是将其添加到initializers而不是app/models。但我认为该文件夹更适合设置。

那么,这样做的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

在开发中运行Rails应用程序时,默认情况下会自动为每个请求重新加载一些文件/类,但如果您尝试在自动加载文件夹中的请求之间执行某些操作,则此行为会导致问题(即,In [274]: df Out[274]: date 0 02/01/2012 9:30 1 02/01/2012 9:30 2 02/01/2012 9:30 In [275]: df[['date','time']] = df.pop('date').str.split(expand=True) In [276]: df Out[276]: date time 0 02/01/2012 9:30 1 02/01/2012 9:30 2 02/01/2012 9:30 下的任何内容。

在您的情况下,由于app常量已经定义,因此负责将类名称映射回文件的Rails代码甚至不会被触发,因此该文件不会自动{ {1}} d。

您建议将其移至初始化程序是一个好主意。此行为确实属于初始化程序。

对于它的价值,你可以避免重新打开Telegram类来通过创建mixin来添加你的方法:

require