2017-04-17 44 views
0

我使用的是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。但我不喜欢Telegram的想法d TelegramBot

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

那么,做到这一点的最佳方法是什么?

回答

2

在开发中运行Rails应用程序时,默认情况下会自动为每个请求重新加载一些文件/类,但是如果您尝试执行自动重新加载的文件夹内的请求之间持续存在的事件(例如,任何根据app)。

对于你的情况,由于Telegram常量已经定义,所以负责将类名映射回文件的Rails代码甚至不会被触发,所以文件不会自动require d。

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

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

module SpecialShortcut 
    def foo 
    # ... 
    end 
end 

# config/initializers/telegram_extensions.rb 
Telegram.extend(SpecialShortcut) 
+0

感谢有关'extend'而不是猴子打补丁的建议,我只是读这个漂亮文章http://www.justinweiss.com/articles/3-ways-to-monkey-patch-without-making-a-mess/并做到了! –