我有一个/ lib / custom
我有custom.rb和custom_page.rb
custom.rb
require 'custom_page.rb'
module Custom
def self.name(params)
# logic
end
end
我已在application.rb config.autoload_paths += %W(#{config.root}/lib)
我似乎无法在我的控制器中调用Custom.name(params)
NoMethodError: undefined method `name' for Custom:Module
我尝试将方法定义为def Custom.name
,使用class << self
和method_function :name
,但没有任何帮助。
我错过了什么吗?
答案 0 :(得分:1)
您还可以使用ActiveSupport::Concern
扩展类和实例方法。在这个模块中:
module Custom
extend ActiveSupport::Concern
included do
# everything but the class methods go here
end
module ClassMethods
# define class methods here
def name(params)
#logic
end
end
end
答案 1 :(得分:1)
这是因为Rails命名约定。在rails控制台中,尝试
irb(main):001:0> Custom::Custom
LoadError: Expected lib/custom/custom.rb to define Custom::Custom
Rais希望您在module Custom::Custom
中定义module Custom
(不是lib/custom/custom.rb
)。
Rails会看到一个文件夹lib/custom
并根据惯例创建一个空模块Custom
(不响应name
方法),如果您愿意定义模块Custom
,你必须写一个文件lib/custom.rb
惯例是
lib/custom.rb #define module Custom
lib/custom/deeper.rb #define module Custom::Deeper
lib/empty_folder/ # rails provides you an empty module EmptyFolder
顺便说一句,您require 'custom_page'
中没有custom.rb
,如果Rails在您的代码中看到CustomPage,它会尝试根据命名约定加载类定义文件,前提是您的{{ 1}}文件路径遵循约定。