ActiveRecord Validation #4 - validates_each -

2014-08-28T00:00:00+00:00 rspec Ruby Rails

公式ドキュメント: http://guides.rubyonrails.org/active_record_validations.html#validates-each

validates_withではレコード単位でバリデーションによる検証処理を別クラス等にまかせるような仕組みだと思うけど、validates_eachは指定した属性に対する検証処理をブロックにまかせるような検証仕組みを提供する物かと

require "rails_helper"

class Entry < ActiveRecord::Base
  validates_each :name do |record, attr, value|
    record.errors.add(attr, "can`t be blank") if value.blank?
  end
end

describe Entry do
  it "validates_eachのテスト" do
    expect(Entry.new({ name: "hoge" }).valid?).to eq true

    entry = Entry.new
    expect(entry.valid?).to eq false

    errors = entry.errors
    expect(errors).not_to be_empty

    messages = errors.messages
    expect(messages).not_to be_empty

    message = messages.first
    expect(message).to eq [:name, ["can`t be blank"]]
  end
end

特に書く事もないので以上

とりあえずはこれでバリデーションヘルパーに関する部分のざっくりとしたドキュメント読みは終了かと。でもまだまだ続く

追記

上記でも書いてるようにvalidates_withとvalidates_eachにはクラスを指定するかブロックを指定するか的な違いって書いたけど、実際validateってのを使えばクラスを別にする事なくブロックでレコード単位でバリデーションする事も可能。てかそれ前回にちょろっと書いてるけど言及してなかったので

require "rails_helper"

class Entry < ActiveRecord::Base
  validate do |record|
    record.errors[:name] << "can`t be blank" if record.name.blank?
  end
end

describe Entry do
  it "validates_eachのテスト" do
    expect(Entry.new({ name: "hoge" }).valid?).to eq true

    entry = Entry.new
    expect(entry.valid?).to eq false

    errors = entry.errors
    expect(errors).not_to be_empty

    messages = errors.messages
    expect(messages).not_to be_empty

    message = messages.first
    expect(message).to eq [:name, ["can`t be blank"]]
  end
end

っていう事かと

ng-strict-di ActiveRecord Validation #3 - validates_with -