2010-10-25 42 views
1

好了,所以我使用了一些模块/ lib目录/插件(不知道确切名称的),假设它的一个认证/授权插件,如:http://github.com/technoweenie/restful-authentication试图了解控制器如何使用一个插件/模块

class HomeController < ApplicationController 


    some_module_name_here 


end 

现在只需添加上面的代码'some_module_name_here',我就可以访问该模块中的方法。

这样做的代码行让我可以访问模块中的方法/对象吗?

那是宣告像说的Java/C#中的变量:

public SomeModule _someModule; 

我知道,插件/模块基本上延长下盖类,但它是如何与一个单一的代码行做到这一点?

它在构造函数中以某种方式调用?

回答

4

当您创建一个ruby插件,并通过environment.rb,bundler或require调用将其加载到rails应用程序中时,这些方法将作为可以调用的“模块”加载。那些像你所说的行为将有一个额外的方法称为acts_as_list或类似的东西。该方法的所有方法是包括该模块的方法放入调用该行的类中。

下面是一个例子,你可以在应用程式的lib文件夹,然后一起玩:

module Bellmyer 
    module Pointless 
    def self.included(base) 
     base.extend PointlessMethods 
    end 

    module PointlessMethods 
     def acts_as_pointless 
     unless included_modules.include? InstanceMethods 
      extend ClassMethods 
      include InstanceMethods 
     end 
     end 
    end 

    module ClassMethods 
     def pointless_class? 
     true 
     end 
    end 

    module InstanceMethods 
     def pointless_instance? 
     true 
     end 
    end 
    end 
end 

该模块可在应用程式中的任何Ruby类,但是方法不实际加载,直到你打电话acts_as_pointless,然后包括和扩展您的类与列出的方法。只有acts_as_pointless方法立即可供模型使用。这是ActiveRecord插件的标准模式。

2

这不是它的工作原理。

当插件或gem被加载时,它添加了一个类方法,在这种情况下,名为some_module_name的ApplicationController。当你调用这些方法时,会包含一些其他的类和实例方法。

看看你最喜欢的宝石或插件,看看他们是如何做到的。

相关问题