Plain Old Ruby Method不更新时间

时间:2017-03-17 00:24:43

标签: ruby-on-rails ruby

我有一个方法

def call
  user.password_reset_sent_at = Time.zone.now
  user.save!
  user.regenerate_password_reset_token
  UserMailer.password_reset(user).deliver_later(queue: "low")
end

def user
  @user = User.find_by_email(@params)
end

我试图重置password_reset_token和password_reset_sent_at

User::PasswordReset.new("foo@foobar.com").call

我看到令牌已更新,但未更新password_reset_sent_at

1 个答案:

答案 0 :(得分:1)

usercall的每次出现都是user方法的另一次调用,从数据库中的记录创建另一个User对象并将其存储在{{1}中}}。效果类似于你写的

@user

您在检索的用户记录的第一个副本上所做的更改在您获取新副本之前永远不会保存。

我认为你的目标是这样定义def call User.find_by_email(@params).password_sent_at = Time.zone.now User.find_by_email(@params).save! ... etc ... end

user

这样定义,def user @user ||= User.find_by_email(@params) end 只会被调用一次,结果存储在User.find_by_email中。对@user的后续调用将重新使用user的现有值,这是一种称为memoization的技术。