我有一个方法
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
答案 0 :(得分:1)
user
中call
的每次出现都是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的技术。