RailsOffice / 081015


RailsOffice

RubyOnRails?勉強会

参考

RubyOnRails2.0チュートリアル

検証-validate-

モデルの定義をしよう(目次?)

  • % cd app/models
  • % emacs article.rb
    初期状態
    class Article < ActiveRecord::Base
    end
    このArticleクラスにvalidatesを実装していきます。

フィールドが空白でないかどうかを検証しよう

  • Articleクラスに「validates_presence_of」を追加する
  • [app/models/article.rb]
    class Article < ActiveRecord::Base
     #Railsで標準で用意されている検証メソッド
     #指定されたフィールドが存在し、その内容が空でないことを確認します。
     validates_presence_of :title, :image_url, :vender, :category,
       :message => "が空の状態で保存することは出来ません。"
    end

有効な数値があるかどうかを検証しよう

  • 数値であることを確認しよう
    • 「validates_numericality_of」メソッドを利用する
  • [app/models/article.rb]
    class Article < ActiveRecord::Base
     #Railsで標準で用意されている検証メソッド
     #指定されたフィールドが存在し、その内容が空でないことを確認します。
     validates_presence_of :title, :image_url, :vender, :category,
       :message => "が空の状態で保存することは出来ません。"
     #価格が有効な数値かどうかを検証します。
     #validate()メソッドを呼び出す。
     validates_numericality_of :price,
       :message => "が有効な数値ではありません。"
    end
  • 有効な範囲を決めよう
    • priceが0以上であることを検証する
  • [app/models/article.rb]
    class Article < ActiveRecord::Base
     #Railsで標準で用意されている検証メソッド
     #指定されたフィールドが存在し、その内容が空でないことを確認します。
     validates_presence_of :title, :image_url, :vender, :category,
       :message => "が空の状態で保存することは出来ません。"
     #価格が有効な数値かどうかを検証します。
     #validate()メソッドを呼び出す。
     validates_numericality_of :price,
       :message => "が有効な数値ではありません。"
     #商品の価格が正のFloatであることを確認する。
     #価格に値が設定されている場合にだけチェックをするように設定。
     protected
       def validate
         errors.add(:price, "は0より大きくなければなりません。") unless  price.nil? || price > 0.0
       end
    end
  • このメソッドは保存されるときだけ呼び出されればよい
    • 「protected」で指定。
  • errors.add()でエラーを記録。
    • このメソッドが呼び出される場合、Railsはデータベースに保存する作業を行いません。らしい。。
      • 最初のパラメータ>>フィールド名を指定
      • 2番目>>エラーとして表示させるメッセージを指定
      • さらに「 unless price.nil?」として、priceフィールドが空(nil)でないかどうかを確認
        もし、フィールドが空であればこの検証は行われません。
        そうしなければ、もし価格が0.0の場合、nilと0.0とを比較することになり、例外が投げられてしまいプログラムが止まってしまいます。
      • 「||」で記述をつなげ、「price > 0.0」として価格が0.0より大きな値であることを指定

名前の重複の検証をしよう

  • 物品の名前の重複の検証
    • 「validates_uniqueness_of」を使う
  • [app/models/article.rb]
    #articlesテーブル内の他の行にこれから保存しようとしている名称が
     #存在していないかどうかを確認。
     validates_uniqueness_of :title,
       :message => "はすでに存在しています。"

正規表現を利用した検証しよう

  • 「image_url」が「.jpg」「.png」「.gif」のどれかで終わっているかどうかを確認しよう。
  • [app/models/article.rb]
     #フィールドの値が正規表現に一致するかどうかを比較します。
     #URLがhttp:で始まり、.gif,.jpg,.pngのどれかで終わっていることを確認。
     validates_format_of :image_url,
       :with => %r{\.(gif|jpg|png)$}i,
       :message => "はGIF,JPG,PNG画像のURLでなければなりません。"
  • 「:with =>」のところに正規表現を記述