Ruby on rails Rails:如何区分保持属性不变与显式地将新值设置为与旧值相同之间的区别?

Ruby on rails Rails:如何区分保持属性不变与显式地将新值设置为与旧值相同之间的区别?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,ActiveRecord用户已验证电子邮件和电子邮件。如果电子邮件发生更改,它会使用以下命令将电子邮件\u verified设置为false: 保存前:如果::email\u已更改,则处理新的电子邮件? process\u new\u email基本上就是: def process_new_email self.email_verified = false end 但是,对于user.update(email:email,email\u verified:true),如果email\u

ActiveRecord
用户
已验证
电子邮件
电子邮件
。如果电子邮件发生更改,它会使用以下命令将
电子邮件\u verified
设置为false:

保存前:如果::email\u已更改,则处理新的电子邮件?

process\u new\u email
基本上就是:

def process_new_email
   self.email_verified = false
end
但是,对于
user.update(email:email,email\u verified:true)
,如果
email\u verified
以前是
true
,则也会将
email\u verified
设置为false

也就是说,这样做失败了:

      user = create(:user, email: 'test@example.com', email_verified: true)
      user.update!(email: 'other@example.com', email_verified: true)
      expect(user.email_verified).to eq(true)
这意味着:

      user = create(:user, email: 'test@example.com', email_verified: true)
      user.update!(email: 'other@example.com')
      expect(user.email_verified).to eq(false)

如何使这两个测试用例都通过?

我认为您可以使用ActiveRecord为您创建的
电子邮件\u verified\u来自\u user?
方法(它为每个属性创建该方法)

请勾选此项,例如:

user = User.find_by(email: 'test@example.com')
user.email_came_from_user? # => false
user.email = 'test@example.com' # setting the same so no change
user.email_came_from_user? # => true
所以,我会这样做:

def process_new_email
  self.email_verified = false unless email_verified_came_from_user?
end

如果已更改,请尝试还原已验证的电子邮件

before_save :revert_email_verified, if: :email_verified_changed?
before_save :process_new_email, if: :email_changed?

def revert_email_verified
  self.email_verified = email_verified_was
end

看起来很有希望!我在上面找不到任何文档,看起来它是一个内部方法?所以它有点像
改变了?
,除了
是真的
只要尝试改变,即使什么都没有改变?@LeoJiang我找不到关于这个的文档(只有源代码),它是一个公共方法,所以我不认为它只打算在内部使用,但我不确定。我想它是在这里被转发到(可能)为什么否决票?为什么你希望你的第一个规范通过?电子邮件正在更改,因此验证标志应为false。你试图做什么的逻辑并不清楚。(仅供参考,我没有否决)我们有一个bug,有人编写了
user.update!(电邮:’other@example.com,email_verified:true)
并且人们无法更新他们的电子邮件。我认为在运行update语句之后,假设
email\u verified=true
是合理的,特别是如果您不熟悉Rails的话