在mailer使用过程中activation_token取值取不到而报错的问题

#原代码
#app/models/user.rb
class User < ApplicationRecord
  attr_accessor :activation_token
end

#app/mailders
class UserMailer < ApplicationMailer
  def account_activation(user)
    @user = user
    mail to: user.email, subject: "用户激活"
  end
end

#controller
UserMailer.account_activation(user).deliver_later

#view
<p><%= link_to "激活链接", edit_account_activation_url(@user.activation_token, email: @user.email) %></p>

#如果没有使用deliver_later,而是使用deliver_now,则不会报错,使用deliver_later报如下错误
missing_required_keys [:id] #其实就是activation_token的值没有找到

问题解决

#我自己的理解是如果对象作为参数在active job中被传递,这个对象的虚拟属性的值会被丢失,解决方式如下
1.虚拟属性本地化,就是activation_token这个属性值被存入到数据库中,这样@user.activation_token肯定可以取值
2.独立将activation_token被作为参数在active job中进行传递
#app/mailders
class UserMailer < ApplicationMailer
  def account_activation(user, activation_token)
    @user = user
    @activation_token = activation_token
    mail to: user.email, subject: "用户激活"
  end
end

#controller
UserMailer.account_activation(user, user.activation_token).deliver_later

#view
<p><%= link_to "激活链接", edit_account_activation_url(@activation_token, email: @user.email) %></p>

results matching ""

    No results matching ""