我通过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
解决了自己的问题 - 问题是包含在类中的语句,如果我把它们移到它外面就可以了。
答案 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语句从内部移到类声明之上,所有方法都开始工作。我的假设是,当它们在声明中时,它们仅可用于该类的对象。