有关update_attribute与update_attributes的Rails教程第11章

时间:2017-10-22 07:21:02

标签: ruby-on-rails railstutorial.org

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_atuser属性。

但如果我换了

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

0 个答案:

没有答案