使用带有 Rails 3.1.1 的 Sorcery 0.7.4 进行身份验证。一切都很顺利,直到我尝试设置密码重置。
激活工作完美并发送电子邮件,但由于某种原因,我在尝试发送重置密码电子邮件时收到此错误。
undefined method `reset_password_email' for nil:NilClass
我完全复制了教程,当我在控制台中进行快速测试时,它按预期发送了电子邮件。在控制台中:
user = User.find(1)
user.deliver_reset_password_instructions!
在实际控制器中,它通过表单提交的电子邮件找到用户,在日志中我可以看到它正在检索正确的用户并设置令牌,但如上错误并回滚。
我检查了 gem 的 Deliver_reset_password_instructions 代码!它似乎没有理由失败。
PasswordResetsController:
@user = User.find_by_email(params[:email])
@user.deliver_reset_password_instructions! if @user
以下是从 gem 代码中复制的:
Instance Method in Gem:
def deliver_reset_password_instructions!
config = sorcery_config
# hammering protection
return false if config.reset_password_time_between_emails && self.send(config.reset_password_email_sent_at_attribute_name) && self.send(config.reset_password_email_sent_at_attribute_name) > config.reset_password_time_between_emails.ago.utc
self.send(:"#{config.reset_password_token_attribute_name}=", TemporaryToken.generate_random_token)
self.send(:"#{config.reset_password_token_expires_at_attribute_name}=", Time.now.in_time_zone + config.reset_password_expiration_period) if config.reset_password_expiration_period
self.send(:"#{config.reset_password_email_sent_at_attribute_name}=", Time.now.in_time_zone)
self.class.transaction do
self.save!(:validate => false)
generic_send_email(:reset_password_email_method_name, :reset_password_mailer)
end
end
The method called above for mailing:
def generic_send_email(method, mailer)
config = sorcery_config
mail = config.send(mailer).send(config.send(method),self)
if defined?(ActionMailer) and config.send(mailer).superclass == ActionMailer::Base
mail.deliver
end
end
同样,所有必需的邮件程序零碎都在那里,并且可以从控制台工作。