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を利用しないエラー処理も可能。(より細かな検証やエラー処理が可能になる)

*1:text_field、text_area等を使う

*2:直接HTMLタグでフォームのコードを書いてしまうと、エラーの発生した項目をマーキングする機能が手軽に利用できない。