在 rails 上设计可确认 5 不工作

devise confirmable on rails 5 not working

我正在使用 rails 5 应用程序。使用设备进行用户管理。我在我的用户模型中启用了 'confirmable' 并且迁移也是一样的。我创建了一个派生自 Devise::Mailer 的自定义邮件程序 class,并在设计配置中设置了该邮件程序以使用自定义邮件程序 class,但是我的确认电子邮件未正确发送。 已经尝试了很多这样的答案线程,但还无法破解。我哪里会出错?

用户模型

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable, :confirmable,
         :recoverable, :rememberable, :trackable, :validatable

  after_create :send_confirmation_email

  def send_confirmation_email
    p 'inside after_create callback func.'
    MyDeviseMailer.confirmation_instructions(self).deliver
  end

end

可确认迁移

def up
    add_column :users, :confirmation_token, :string
    add_column :users, :unconfirmed_email, :string
    add_column :users, :confirmed_at, :datetime
    add_column :users, :confirmation_sent_at, :datetime
    add_index :users, :confirmation_token, unique: true
end

我的自定义邮件程序 class 来自 Devise::Mailer

class MyDeviseMailer < Devise::Mailer

  helper :application
  include Devise::Controllers::UrlHelpers
  default template_path: 'devise/mailer'

  def confirmation_instructions(record, token, opts={})
    devise_mail(record, :confirmation_instructions, opts)
  end
end

几个小时后,我发现我在 things.Followed here 上写得很好的文章是错误的。在下面更新了我的解决方案:

重构 confirmation_instructions 方法存在于我的 自定义邮件程序 class 中,如下所示:

def confirmation_instructions(record, token, opts={})

    if record.email.present?
      opts[:subject] = "Welcome #{record.email.split('@').first.capitalize}, Confirm your asana account"
    else
      opts[:subject] = "Confirm Your Asana Account"
    end

    super

  end

在我的用户模型中将函数调用更改为此:

MyDeviseMailer.confirmation_instructions(self, self.confirmation_token).deliver

这就是最终对我有用的方法。