在Chapter 11 of the Rails tutorial book(第11.3.2节)中,作者在footnote(8)中说:
这里我们使用两次调用update_attribute而不是一次调用updated_attributes,因为(根据第6.1.5节)后者将运行验证。在这种情况下缺少用户密码,这些验证将失败。
因此使用〜/ app / controllers / account_activations_controller.rb 中的代码:
class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email])
if # user and link is valid
user.update_attribute(:activated, true)
user.update_attribute(:activated_at, Time.zone.now)
# Handle successful activation
else
# Handle unsuccessful activation
end
end
end
更新activated
对象的activated_at
和user
属性。
但如果我换了
user.update_attribute(:activated, true)
user.update_attribute(:activated_at, Time.zone.now)
到
user.update_attributes(activated: true, activated_at: Time.zone.now)
激活仍然成功,即使缺少用户密码,数据库也会更新。
为什么会这样?我已经在rails控制台上进行了测试,并且发现只有当由于模型文件中的验证而提供的哈希值无效时,update_attributes
才会无法更新。但是,要更新未通过模型文件验证的属性,更新仍会发生。
我很困惑,因为他们可以使用update_attributes
代替两行,因为它们都有效。
编辑:这里也是我的用户模型,因为您可以看到它具有正确的密码验证。
class User < ApplicationRecord
.
.
has_secure_password
validates :password, presence: true, length: { minimum: 6 }, allow_nil: true
.
end