2

MichaelHartlの[RailTutorial]の第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?呼び出し。ソースコードを介してメソッドチェーンをたどることができます:activerecord / lib / active_record / validates.rbで定義され、 activemodel / lib / active_model /validations.rbで呼び出されますrun_validations!run_callbacks :validatevalid?super valid?

それがどのように機能するかについてです。また、モデルは、保存されていない場合でも有効である場合と無効である場合があります。ケースのように保存されなかった場合(new_record?returns true)、の検証:createが呼び出されます。基本的に、モデルが有効な場合は保存できます。保存されている場合(new_record?戻りますfalseが、保存されていない変更が含まれている可能性があります)、の検証:updateが呼び出されます。

于 2012-05-17T18:41:05.227 に答える