激活摘要未保存到db

时间:2015-06-03 15:05:23

标签: ruby-on-rails ruby postgresql ruby-on-rails-4

要为想要更新其电子邮件地址的用户创建确认链接,用户控制器方法会调用模型方法@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)添加到模型方法中。但这并没有挽救价值(对我来说似乎并不安全)。

1 个答案:

答案 0 :(得分:1)

未更新数据库的原因是您没有保存模型。

添加保存!在私有方法的末尾或使用update_attributes()查询,它会自动将值保存到DB。