неопределенный метод в модуле

#ruby-on-rails #ruby #ruby-on-rails-4 #module

#ruby-on-rails #ruby #ruby-on-rails-4 #модуль

Вопрос:

У меня есть /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 но ничего не помогает..

Я что-то упускаю?

Комментарии:

1. это действительно то, что есть в вашем custom.rb? Это недопустимый ruby как есть и должен вызывать синтаксическую ошибку

2. нет, это не так, я попытался упростить его

3. О чем Custom::name ?

4. @zishe это тоже не работает

5. вы кодируете допустимое ожидание require . repl.it/USi

Ответ №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 в вашем коде, он попытается загрузить файл определения класса на основе соглашения об именовании, учитывая, что ваш custom_page.rb путь к файлу соответствует соглашению.

Комментарии:

1. еще одна вещь, которую следует подчеркнуть, это то, что без исправления вашего кода, после того, как вы попробовали Custom::Custom в консоли Rails, попробуйте еще раз Custom.name , он покажет положительный результат. Потому что он заставил Rails читать lib/custom/custom.rb и добавил метод name в существующий модуль Custom .

Ответ №2:

Вы также можете использовать 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. Custom модуль все еще не name имеет метода. Эта функция расширяет методы класса.