Hatena::ブログ(Diary)

ザリガニが見ていた...。 このページをアンテナに追加 RSSフィード

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

*1:text_field、text_area等を使う

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

KantaKanta 2006/11/12 00:17 毎回丁寧な検証をされていて、とても勉強になります。
> 検索機能ってないのだろうか?
こちらのサイトでインクリメンタルサーチができます。ご参考までに。
http://railsapi.masuidrive.jp
http://api.rails2u.com/

zariganitoshzariganitosh 2006/11/12 18:19 毎回、有益な情報ありがとうございます。
「Ruby on Rails 初心者の館」のリンク集でも紹介されていましたね。
本家のサイトでもブラウザのページ検索で、ちゃんと検索できますね。理解しようという気持ちで見ないからいけなかったのです。反省です。
それから、遅ればせながら、このブログも紹介されているようで恐縮です。

KantaKanta 2006/11/13 00:55 お返事どうもです。
とても参考になるので勝手ながらリンクさせていただきました。
WEB上から欲しい情報をピンポイントで見つけるのは検索を駆使しても難しいですよね。
私も気になったので、URLパターンマッチの定番を探してたのですが
それっぽいのが見つかったのでエントリーにあげておきます。
#でも使い方がまだよくわかってなかったり。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証