Sequelのvalidation_helpersの使い方
Sequelのvalidation_helpersの使い方がよくわからなくて、試行錯誤したのでメモしておく。
class Documents < Sequel::Model plugin :validation_helpers def validate validates_min_length 1, :title validates_min_length 1, :body end unless table_exists? set_schema do primary_key :id string :title string :body end end end doc = Documents.new(:title => "", :body => "") doc.validate p doc.errors
plugin :validation_helpersとか def validateのあたりはオフィシャルなマニュアルにも書いてあるので特に問題ないと思われる。
注意しないといけないのは、
- バリデーション用のメソッドを自分で呼び出さないといけない(doc.validateのあたり)
- バリデーションに失敗しても例外が飛んだりする訳ではないし普通にsaveメソッドで保存できる
というあたりだろう。ActiveRecordだとsave時にvalidationが自動で働いて、validationに失敗するとそもそも保存されないのだが、Sequelのvalidation_helpersは全然まったくそんなことはない。validateは自分で呼び出さないといけないし、バリデーションに失敗した状態でも普通に保存できる。
この挙動に気づかず、最初は Documents.insert(params) みたいなコードを書いていて、全然validationが実行されずに困った。バリデーションしたい場合はinsertを使わずに、newしてvalidateしてエラーのチェックが必要、という手順を自分で実行する必要があるようだ。
エラーメッセージは一つのパラメーターに関しては一つしか出力しないし、エラーメッセージもSequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS[:min_length][:message] みたいなのを書き換えれば簡単にカスタマイズできるし、そこら辺は結構使い勝手が良い。validateメソッド自体が自分で定義している物なので、複雑なバリデーションは自分で好き勝手にバリデーションをかければいいしね。