#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
имеет метода. Эта функция расширяет методы класса.