我正在使用ActiveAdmin通过提供电子邮件创建其他管理员,并设置了一个阻止重置密码到新添加的电子邮件:
class AdminUser < ActiveRecord::Base
after_create { |admin| admin.send_reset_password_instructions }
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable,
:recoverable, :rememberable, :trackable, :validatable
def password_required?
new_record? ? false : super
end
end
但是,我开始收到reset token invalid
错误,并且在检查时发现reset_password_token
没有被保存。
当我尝试调试时,我将错误追溯到设计的Recoverable
模块(recoverable.rb
文件)的set_reset_password_token方法的方法:
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
self.save(validate: false)
raw
end
令牌已生成,但当我在self
行之前检查self.save(validate: false)
时,self.reset_password_token
没有附加任何内容,它为零。
为了让我最终复杂化,当我现在手动运行行self.reset_password_token = enc
并且self.reset_password_token
实际上现在保存令牌,保存后,并检查数据库,reset_password_token
新保存的AdminUser仍为零。
这可能会发生什么?
但请注意:devise test suit on git表明情况不应如下所示:
test 'should not clear reset password token for new user' do
user = new_user
assert_nil user.reset_password_token
user.send_reset_password_instructions
assert_present user.reset_password_token
user.save
assert_present user.reset_password_token
end