Rails - 没有包含的模块

时间:2012-06-27 20:18:03

标签: ruby-on-rails ruby

我对使用动态添加方法到我的Ruby类的模块有很多乐趣。

我使用include语法将这些内容带入我的类中,一切都按预期工作。

但是,我注意到当我使用诸如Authlogic或Paperclip之类的gem时,不需要显式导入。我可以简单地在我的ActiveRecord派生模型上发出acts_as_authentic或has_attached_file,类方法自动在范围内并调用来装饰我的类。

这里发生了什么?是否包含在Gemfile中将所有类方法隐式放在范围内?

我想写一个Gem以同样的方式行事。

编辑 - 这篇文章http://yehudakatz.com/2009/11/12/better-ruby-idioms/表明正在使用include增强ActiveRecord :: Base。这是发生了什么事吗?

2 个答案:

答案 0 :(得分:3)

最好的答案是代码本身。

Rails插件通常使用Rails::Railtie(这里是Paperclip example)来向Rails添加功能。

正如您从Paperclip::Railtie文件中看到的那样,Paperclip扩展了ActiveRecord::Base,包括一些自定义模块。在这种情况下,Paperclip::Glue是提供has_attached_file宏的方法,以及其他几种方法。

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

答案 1 :(得分:0)

只要应用程序的gemfile中需要gem,Rails 3将在应用程序启动时加载所有依赖项。