Произошло на рубине 3.1.2 и рельсах 7.0.4
модуль: приложение/модели/проблемы/password_regeneratable.rb
module PasswordRegeneratable
extend ActiveSupport::Concern
module ClassMethods
def generate_password
SecureRandom.urlsafe_base64(self.class::DEFAULT_PASSWORD_LENGTH)
end
end
end
модель: приложение/модели/user.rb
class User < ApplicationRecord
include PasswordRegeneratable
DEFAULT_PASSWORD_LENGTH = 30
end
Когда я пытаюсь вызвать User.generate_password, это дает мне эту ошибку:
/app/app/models/concerns/password_regeneratable.rb:6:in `generate_password': uninitialized constant Class::DEFAULT_PASSWORD_LENGTH (NameError)
Did you mean? Class::DEFAULT_SETTINGS
Я хочу использовать модуль, чтобы я мог повторно использовать этот метод generate_password и, возможно, некоторые другие методы для других классов моделей в будущем. Правильна ли такая реализация?
module PasswordRegeneratable
extend ActiveSupport::Concern
module ClassMethods
def generate_password
SecureRandom.urlsafe_base64(self::DEFAULT_PASSWORD_LENGTH)
end
end
end
В классе метод self
— это класс. Таким образом, self.class
дает вам путано названный класс Class, поскольку в Ruby классы являются экземплярами класса.
На этот вопрос сложнее ответить. Использование собственного управления паролями/аутентификации обычно считается рискованным по сравнению с использованием проверенных решений. Также спорно, если вы должны возлагать больше ответственности на модель VS, имеющую отдельный объект, который отвечает за генерацию паролей по умолчанию.
Что еще более важно, считается ли эта реализация приемлемой? Я до сих пор не очень понимаю, как модули и классы работают в ruby.