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

时间:2015-07-03 09:25:11

标签: ruby-on-rails email devise token devise-confirmable

在我的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属性的内容

1 个答案:

答案 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