Rails/Devise: 无法从控制器手动发送确认邮件

Rails/Devise: not able to send confirmation mail manually from controller

在我的 Rails/Devise 应用程序中,我需要为具有特定角色的用户手动发送确认电子邮件并延迟发送。

我现在做的是: a) 在 User.rb:

before_save :skip_mail_if_role1
def skip_mail_if_role1
  self.skip_confirmation_notification! if self.role == 'role1'
end

b) 在此角色用户的自定义注册控制器中:

Devise::Mailer.confirmation_instructions(resource, resource.confirmation_token).deliver_later(wait: 5.minutes)

当然,我收到了一封带有错误令牌的电子邮件,但点击按钮没有任何反应。任何虚拟令牌也什么都不做。当我没有传递第二个参数时,我得到参数错误(至少应该有 2 个,就 here 它们只传递 user 参数而言,这是错误的)。

所以我想知道我应该将什么作为控制器的令牌传递到那里才能使这项工作正常进行?

更新:

使用 this 指令我实现了自定义设计 MyMailer 但我仍然不知道在调用 MyMailer.confirmation_instructions(resource, ????).deliver[=19 时我应该在控制器中将什么作为 token 属性传递=]

我覆盖了 devise 的默认逻辑以生成令牌,然后用它来确认和发送电子邮件...

user.rb

  def create_password_reset_token
    Rails.logger.info "=======Creating reset password token======="
    generate_token(:reset_password_token) ##unless self.reset_password_token.present?
    update_attribute(:reset_password_sent_at,Time.zone.now)
    save!
    ####refresh the user to get latest token which is used to reset password as find_by_reset_password_token
    self.reload
  end

  def generate_token(column)
    begin
      self[column] = SecureRandom.urlsafe_base64
    end  ##while User.exists?(column => self[column])
  end

并在您自己的发送电子邮件的方法中使用上述逻辑

 def send_reset_password_instructions(attributes={})
        user=User.find_by_email attributes['email']
        ##generate reset password token shown above
        user.create_password_reset_token 
        ##@resource=User.find_by_email(attributes['email'])
        #i used delay,you may use delay_for() or delay_until as needed from sidekiq
        UserMailer.reset_password_instructions(attributes['email']).deliver

      end