要为想要更新其电子邮件地址的用户创建确认链接,用户控制器方法会调用模型方法@user.send_activation_email
。控制器方法的相关部分:
if @user.update_attributes(user_params)
puts "DIGEST1: #{@user.activation_digest}"
@user.send_activation_email
puts "DIGEST2: #{@user.activation_digest}"
puts "DIGEST2_RELOAD (should be same as previous but isn't): #{@user.reload.activation_digest}"
模型方法如下:
def send_activation_email
create_activation_digest
update_columns(activation_sent_at: Time.zone.now)
UserMailer.new_email_activation(self).deliver_now
end
private
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end
私有方法也用于帐户激活。将摘要自动保存到activation_digest
列。然而,这似乎不适用于上述情况。也就是说,虽然它生成了一个新的摘要,但它没有将该值保存到db(我在调用模型方法之前和之后通过在控制器方法中使用puts
来知道这一点)。
为什么不将摘要值保存到数据库?我尝试将update_columns(activation_sent_at: Time.zone.now, activation_digest: self.activation_digest)
添加到模型方法中。但这并没有挽救价值(对我来说似乎并不安全)。
答案 0 :(得分:1)
未更新数据库的原因是您没有保存模型。
添加保存!在私有方法的末尾或使用update_attributes()查询,它会自动将值保存到DB。