Итак, во-первых, если вы хотите перезаписать функцию из модуля devise, вы можете просто написать ее с тем же именем в файле модели, возможно, в models / user.rb. Чтобы перезаписать set_reset_password из восстанавливаемого модуля, вы можете просто сделать следующее (как предложено Серхио Туленцев здесь ):
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :lockable
...
protected
def set_reset_password_token
...
end
end
Теперь, чтобы перейти к желаемому исходному токену (до того, как он будет зашифрован), в моем случае я хотел, чтобы он имел 6 цифр, содержащих только AZ, az, 0-9 цифр, давайте посмотрим, что делает devise ( ссылка на файл github ):
def set_reset_password_token
raw, enc = Devise.token_generator.generate(self.class, :reset_password_token)
self.reset_password_token = enc
self.reset_password_sent_at = Time.now.utc
save(validate: false)
raw
end
То, что Devise.token_generator.generate
( видно здесь ) делает, генерирует необработанный токен, используя SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')
(длиной 20, как видно здесь ) и возвращает необработанный и зашифрованный токен, если только Некоторому пользователю уже назначен тот же токен.
Наконец, вам нужно переписать этот set_password_token с использованием SecureRandom функций, связанных с tr , для генерации токенов любым удобным вам способом, и не забудьте убедиться, что токен является уникальным и в настоящее время не используется.