2017-04-17 8 views
0

私はtelegram-bot宝石を使用しています。それはTelegramと呼ばれるモジュールを持っています。私はそれを拡張して、最も一般的な呼び出しのためのショートカットとして1つのメソッドを追加したいと思います。すでに宝石に存在するモジュールを要求する方法は?猿のパッチの種類

作成する方法は、デフォルト設定のTelegram.send_message(text)です。コンソール上で、私はそれが未定義のメソッドを言うTelegram.send_messageを実行した場合

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

はそうするために私は、元のモジュールを拡張 app/models/telegram.rbtelegram.rbファイルを追加しました。私は require 'telegram'を行う場合 send_message方法が機能するようになりました、(私はすでに Telegram宝石上の(1)と呼ばれるモジュールがあるように、そのが自動的にロードしませ思います。今、私はアプリの初期化時に、それを必要とする場合、

は、私が最初に試したことはあります私application.rbに必要と追加が、私はLOAD_PATHはまだapp/modelsを含んでいないと思い、ので、それは、cannot load such file言います。私は?

別の方法としては、TelegramBotのように、それを別の名前を与えるだろう必要が追加することができます

。しかし、私はTelegramのアイデアが好きではありませんd TelegramBot

app/modelsの代わりにinitializersに追加する方法もあります。しかし、私はフォルダは設定のためのものだと思う。

これを行うには、どのような方法が最適ですか?

答えて

2

開発時にRailsアプリケーションを実行すると、デフォルトでは各リクエストでいくつかのファイルやクラスが自動的にリロードされますが、この動作は自動ロードされたフォルダ内のリクエスト間でappのもの)。

Telegram定数がすでに定義されているため、クラス名をファイルにマッピングするRailsコードは起動されないため、ファイルは自動的にrequireにはなりません。

これをイニシャライザに移動することをお勧めします。この動作は実際にはイニシャライザに属します。何が価値があるために

、あなたはミックスイン作成することによって、あなたの方法を追加しTelegramクラスを再開避けることができます。代わりに猿のパッチのextend` `についての提案を

module SpecialShortcut 
    def foo 
    # ... 
    end 
end 

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

おかげで、私はこの素敵なを読んでいました記事http://www.justinweiss.com/articles/3-ways-to-monkey-patch-without-making-a-mess/そしてそれはまさにそれでした! –

関連する問題