2

我正在查看 Michael Hartl 的 [Rail Tutorial] 第 6 章中的一些 RSpec 代码:http ://ruby.railstutorial.org/chapters/modeling-users#code:validates_uniqueness_of_email_test 。它是为了测试用户模型的电子邮件属性的唯一性验证方法而编写的。它看起来像这样:

清单 6.18。拒绝重复电子邮件地址的测试。(*spec/models/user_spec.rb*)

require 'spec_helper'

describe User do

  before do
    @user = User.new(name: "Example User", email: "user@example.com")
  end
  subject { @user }
  .
  .
  .
  describe "when email address is already taken" do
    before do
      user_with_same_email = @user.dup
      user_with_same_email.save
    end

    it { should_not be_valid }
  end
end

这是用户模型验证代码:

validates :email, presence: true, format: { with: VALID_EMAIL_REGEX },
                    uniqueness: true

我的问题是:验证实际上是如何工作的? 有一个具有相同电子邮件地址的用户已经保存到数据库中,并且在我什至尝试保存之前,@user 实例上的 Rails 验证返回为无效?Rails 验证器是否使用当前数据来验证用户实例,即使它们只是存储在内存中并且当前没有尝试添加到数据库中?

4

1 回答 1

2

be_valid呼吁。valid?_ @user这就是 rspec 的工作原理。并valid?调用run_validations!反过来调用run_callbacks :validate. 您可以通过源代码跟踪方法链:valid?activerecord / lib / active_record / validations.rbsuper valid?中定义并在activemodel / lib / active_model / validations.rb中调用

这就是它的工作原理。即使模型未保存,模型也可能有效或无效。如果它从未像您的情况那样保存(new_record?返回true),:create则调用验证。基本上,如果模型有效,则可以保存。如果它已保存(new_record?返回false但它可以包含未保存的更改),:update则调用验证。

于 2012-05-17T18:41:05.227 回答