好吧我正在使用一些模块/ lib /插件(不确定确切名称),让我们说它是一个身份验证/授权插件,如:http://github.com/technoweenie/restful-authentication
class HomeController < ApplicationController
some_module_name_here
end
现在只需添加“some_module_name_here”上面的代码,我就可以访问该模块中的方法了。
这行代码是什么让我可以访问模块中的方法/对象?
是否声明了一个变量,比如说java / c#:
public SomeModule _someModule;
我知道插件/模块基本上扩展了这个类,但是如何用一行代码来实现这个呢?
是否以某种方式在构造函数中调用?
答案 0 :(得分: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插件的标准模式。
答案 1 :(得分:2)
这不是它的工作原理。
当加载插件或gem时,它会添加一个类方法,在本例中为ApplicationController,名为some_module_name
。当您调用该方法时,会包含一堆其他类和实例方法。
查看您最喜欢的宝石或插件,看看他们是如何做到的。