试图了解Controller如何使用插件/模块

时间:2010-10-25 13:34:20

标签: ruby-on-rails ruby

好吧我正在使用一些模块/ lib /插件(不确定确切名称),让我们说它是一个身份验证/授权插件,如:http://github.com/technoweenie/restful-authentication

class HomeController < ApplicationController


    some_module_name_here


end

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

这行代码是什么让我可以访问模块中的方法/对象?

是否声明了一个变量,比如说java / c#:

public SomeModule _someModule; 

我知道插件/模块基本上扩展了这个类,但是如何用一行代码来实现这个呢?

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

2 个答案:

答案 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。当您调用该方法时,会包含一堆其他类和实例方法。

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