在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>