模块中的未定义方法

时间:2014-06-19 16:30:31

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

我有一个/ 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 << selfmethod_function :name,但没有任何帮助。

我错过了什么吗?

2 个答案:

答案 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}}文件路径遵循约定。