Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby on Rails | Validation | on

概要

on

詳細

ActiveRecordで、validation時にonを利用することで、
Modelの任意のアクション時のみValidationを実行することができます。

サンプル

テーブル定義
CREATE TABLE "articles" (
  "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
  "title" varchar(255), 
  "text" text, 
  "created_at" datetime, 
  "updated_at" datetime
);
Validation
class Article < ActiveRecord::Base
  has_many :comments, dependent: :destroy
  validates :title, length: { is: 5 }, on: :create
end
試行

rails console(pry)で試行します。

新規作成時(最初にsaveするまで)はValidationが有効になっているが、
一度保存した後はValidationが無効になっていることがわかります。

[1] pry(main)> a = Article.new
=> #<Article id: nil, title: nil, text: nil, created_at: nil, updated_at: nil>
[2] pry(main)> a.title = 4
=> 4
[3] pry(main)> a.valid?
=> false
[4] pry(main)> a.errors.messages
=> {:title=>["is the wrong length (should be 5 characters)"]}
[5] pry(main)> a.title = '12345'
=> "12345"
[6] pry(main)> a.valid?
=> true
[7] pry(main)> a.save
   (0.1ms)  begin transaction
  SQL (3.1ms)  INSERT INTO "articles" ("created_at", "title", "updated_at") VALUES (?, ?, ?)  [["created_at", "2014-07-02 23:53:51.377843"], ["title", "12345"], ["updated_at", "2014-07-02 23:53:51.377843"]]
   (3.4ms)  commit transaction
=> true
[8] pry(main)> a.title = 'invalid title'
=> "invalid title"
[9] pry(main)> a.valid?
=> true
[10] pry(main)> a.save
   (0.1ms)  begin transaction
  SQL (1.9ms)  UPDATE "articles" SET "title" = ?, "updated_at" = ? WHERE "articles"."id" = 22  [["title", "invalid title"], ["updated_at", "2014-07-02 23:54:49.783148"]]
   (3.4ms)  commit transaction
=> true