validateのバリエーション
たった1行のvalidates_presence_ofが入力値の検証とエラー表示を行っているが、それを実現するためにはいろいろな機能が絡み合っていることが分かった。
validateに関連することで分かったこと
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を利用しないエラー処理も可能。(より細かな検証やエラー処理が可能になる)