2

使用带有 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

同样,所有必需的邮件程序零碎都在那里,并且可以从控制台工作。

4

2 回答 2

3

在魔法初始化程序中取消注释此行

user.reset_password_mailer = UserMailer  
user.reset_password_email_method_name = :reset_password_email
于 2012-02-27T03:45:16.423 回答
0

检查您的 app/mailers/user_mailer.rb 文件。

如果您按照本教程进行操作,您可能会执行类似的操作,例如将 wiki 中的方法定义(接受一个参数)复制并粘贴到生成的方法定义(不接受任何参数)中,因此 1 表示 0 ArgumentError。

换句话说,你可能有这样的东西:

def reset_password_email
   def reset_password_email(user)

这很糟糕,但很容易解决:-)

于 2012-01-03T18:27:30.643 回答