在我的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
但我仍然不知道在调用token
MyMailer.confirmation_instructions(resource, ????).deliver
属性的内容
答案 0 :(得分:1)
我从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