2012-06-27 29 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将在应用程序启动时加载所有依赖关系。