2006-11-11 欲しい機能をカスタマイズ!その5
validateのバリエーション
たった1行のvalidates_presence_ofが入力値の検証とエラー表示を行っているが、それを実現するためにはいろいろな機能が絡み合っていることが分かった。
validateに関連することで分かったこと
- データベースへの追加または更新の前に検証される。一つでもエラーが発生すると、そのレコードは一切保存されない。
- モデルはerrorsという看板を持っていて、エラーが発生すると、エラーフィールド名とエラーメッセージがその看板に保存される。
- 手軽にvalidateを活用するためには、入力フォームの描画はRailsが用意したメソッド*1を利用するべき*2。
validates_のバリエーション
| メソッド | 検証方法 |
|---|---|
| validates_presence_of | 値が入力済であること検証 |
| validates_uniqueness_of | 同じ値が存在しないことの検証 |
| validates_length_of | 文字列の長さの検証 |
| validates_numericality_of | 数値であることの検証 |
| validates_format_of | 正規表現による検証 |
- validates_のバリエーションは、この他にもたくさんある。またオプション指定で細かな設定も出来る。Rails Framework Documentation参照
- 参照と書いたが、分からない者にとっては、どこに何が書いてあるのか分かりにくい...。検索機能ってないのだろうか?
- ここにありました。Rails API ドキュメント api.rails2u.com
利用例
validates_presence_of :title, :description, :url
- 値が入力されていればOK。未入力ならエラー。
- 検証フィールド名は、カンマで区切って複数指定できる。
validates_uniqueness_of :title
- データベースのテーブルのtitleフィールドの値と重複していなければOK。重複していたらエラー。
validates_length_of :title, :maximum => 10
- 最大10文字までOK。10文字を超えたらエラー。
validates_length_of :title, :within => 8..16
- 8文字から16文字までOK。それ以外はエラー。
validates_numericality_of :title
- 数値の入力であればOK。数値に変換できない文字列はエラー。
validates_format_of :url, :with => /^http:\/\/[^<>]+$/
- 「http://」で始まって、「<」と「>」どちらも含まない文字が続くならOK。それ以外はエラー。(...と書いたつもり。)
- 正規表現を利用すれば、相当広範囲なことが検証可能だ。しかし、相当奥が深い世界でもある...。
- validates_uniqueness_of以外は、正規表現で同じ検証が可能だ。
- 正規表現については、逆引きRuby - パターンマッチを参考にさせて頂いた。感謝です。
- リンクの入力については、どのように利用するのがセキュリティ上のベストなのか、定番の方法が知りたい...。
メソッド定義でのvalidate
class Software < ActiveRecord::Base validates_presence_of :title end
上記メソッド呼び出しは、下記のようにメソッド定義したのと同じ動作をする。
class Software < ActiveRecord::Base
def validate
errors.add(:title, "can't be blank.") if read_attribute(:title).blank?
end
end
- ここでは、titleフィールドがブランクであれば、看板errorsにエラー情報を追記している。
- メソッド定義次第では、看板errorsを利用しないエラー処理も可能。(より細かな検証やエラー処理が可能になる)
トラックバック - http://d.hatena.ne.jp/zariganitosh/20061111/1163249973
リンク元
- 656 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=rails+errors+validate&btnG=Google+検索&lr=lang_ja
- 631 http://www.google.co.jp/search?q=rails+validate&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 502 http://www.google.co.jp/search?q=rails+validate&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox
- 312 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=rails+validates
- 221 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-40,GGLJ:ja&q=validator+正規表現
- 207 http://www.google.co.jp/url?sa=t&rct=j&q=rails validate&source=web&cd=1&ved=0CBsQFjAA&url=http://d.hatena.ne.jp/zariganitosh/20061111/1163249973&ei=AwaETtiIHoeOiAeTxMGhDw&usg=AFQjCNEk08T6tZub53UkF8BZlNpSohNE0g&cad=rja
- 177 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&q=Ruby+on+Rails+Validate&suggest=0&sa=X&oi=cjkrefinements&resnum=0&ct=result&cd=1
- 172 http://www.google.co.jp/search?hl=ja&source=hp&q=rails+validate&lr=&aq=f&oq=
- 142 http://www.google.co.jp/search?aq=f&sourceid=chrome&ie=UTF-8&q=rails+validates
- 142 http://www.google.co.jp/search?q=rails+validates&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:ja:official&client=firefox-a