ActiveRecord Validation #4 - validates_each -
公式ドキュメント: 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
っていう事かと