在Gem的对象上调用模块的方法?

时间:2014-12-03 19:12:41

标签: ruby-on-rails ruby ruby-on-rails-4 koala

我通过ruby gem(Koala)生成了一个对象,我用辅助方法编写了一些模块。为了能够在对象上的模块中使用方法,我需要做什么?

如果我,model_object = Model.new,model_object将有权访问所有实例变量但对象没有(见下文)。

Ruby 2.1,Rails 4.1

config / application.rb - 自动加载文件夹

中的模块
config.autoload_paths << Rails.root.join('lib/module_folder')

模型

class Model < ActiveRecord::Base
   include Module
   include Module::Module2
   include Module::Module3

   def self.create_account(token)
      object = Module.module_class_method(token) #this works and generates the Koala object
      ERROR: object.module2_instance_method # Error: NoMethodError Exception: undefined method
   end
 end

模块

module Module
   extend ActiveSupport::Concern
end

单词数

module Module
    module Module2
        def module2_instance_method
        end
    end
end

解决了自己的问题 - 问题是包含在类中的语句,如果我把它们移到它外面就可以了。

3 个答案:

答案 0 :(得分:0)

我相信如果你将模块包含在app /目录下的某个地方 - 它们将自动包含在内。否则,您实际上必须使用require语句

明确地在rails代码中要求它们

答案 1 :(得分:0)

如果没有看到实际代码,我认为代码段中Module2的问题是self.方法。

因为您在module2_instance_method的实例上调用了object,所以模块中的方法不能包含self.,因为它指定了一个类方法,因此必须被称为Module::Module2.module2_instance_but_not_really_because_I_am_a_class_method

我相信如果您将def self.module2_instance_method ... end更改为def module2_instance_method ... end,则不应再收到NoMethodError例外。

如果我误读或误解OP,请道歉。

答案 2 :(得分:0)

将include语句从内部移到类声明之上,所有方法都开始工作。我的假设是,当它们在声明中时,它们仅可用于该类的对象。