モデルのクラスにはバリデーションを設定することが可能です。バリデーションによって、モデルに保存することができるデータの種類を制限することができます。特にバリデーションが有効なのは store
コレクションに対してですが、他でも利用することができます。
現在のところ、以下のバリデーションが実装されています (更に追加される予定です)。
より詳細な内容については、このフォルダー を参照してください。
class Info < Volt::Model
validate :name, length: 5
validate :state, presence: true
end
バリデーションがある場合、ここでバッファに対して save!
を実行すると、以下のようになります:
save!
の結果の promise がエラーオブジェクトを伴って reject されます。バリデートのためのブロックを渡すことで、カスタムのバリデーションを設定することができます。
validate do
if _name.present?
{}
else
{ name: ['must be present'] }
end
end
ブロックはエラーのハッシュを返す必要があります。キーはそれぞれ、フィールドのエラーメッセージの配列に対応します。複数のエラーを返すことも可能で、その場合、それらのエラーはマージされます。
特定の状況でのみバリデータを使いたい、というケースがあると思います。例えば、blog のポストがあったとき、そのポストが publish されている場合に限り、publish_date というデータが必ず設定されている必要があるといった場合です。validations
ブロックの内部では、自由にバリデータを利用することができます (複数形であることに注意)。
class Post < Volt::Model
field :title, String
field :published, Boolean
field :publish_date
validate :title, length: 5
validations do
if published
validate :publish_date, presence: true
end
end
end
注意: Boolean 型は現在サポートされていません。String や Numeric 以外の型のサポートも追加される予定です
また、create/update の場合にのみバリデーションを実行したい場合は以下のようにします。
class Post < Volt::Model
field :published, Boolean
field :publish_date
validations(:update) do
if _published
validate :publish_date, presence: true
end
end
end
注意: Boolean 型は現在サポートされていません。String や Numeric 以外の型のサポートも追加される予定です
validations
に :create または :update を状態に応じて渡すことも可能です
class Post < Volt::Model
...
validations do |action|
if action == :update && _published
validate :publish_date, presence: true
end
end
end
TODO: Document custom validator classes