2012-06-27 43 views
0

我對動態添加方法到我的Ruby類的模塊有很多樂趣。Rails - 沒有包含的模塊

我使用include語法將它們帶入我的類,並且所有內容都按預期工作。

但是,我注意到,當我使用諸如Authlogic或Paperclip等寶石時,不需要顯式導入。我可以簡單地在我的ActiveRecord派生模型上發出acts_as_authentic或has_attached_file,並且類方法自動處於範圍內並被調用來修飾我的類。

這是怎麼回事?是否包含在Gemfile中將所有類方法隱式地放在範圍內?

我想寫一個Gem以相同的方式表現。

編輯 - 此帖子http://yehudakatz.com/2009/11/12/better-ruby-idioms/表明ActiveRecord :: Base正在使用include進行增強。這是怎麼回事?

回答

3

最好的答案是代碼本身。

Rails插件通常使用Rails::Railtie(這裏是Paperclip example)爲Rails添加功能。

正如您從Paperclip::Railtie文件中看到的,Paperclip擴展了ActiveRecord::Base,包括一些自定義模塊。在這種情況下,Paperclip::Glue是提供has_attached_file宏以及其他幾種方法的宏。

ActiveRecord::Base.send(:include, Paperclip::Glue) 
+0

該代碼需要加載回形針庫,我敢肯定它只需要包含在gemfile中,以便在MVC中使用回形針方法。 – holaSenor

+0

正如我在答案中所寫的,您不需要手動執行此操作。當你需要寶石時,這是爲你完成的。用戶要求解釋發生了什麼,這是答案。 –

0

只要在應用程序的gemfile中需要gem,Rails 3將在應用程序啓動時加載所有依賴關係。