setoya-blog

システム開発技術、データ分析関連でお勉強したことや、山奥生活を綴る、テンション低めなブログです。

Railsのモデルの新規作成時のみにバリデーションを掛ける

Railsのモデルの機能を使ったバリデーションは便利だが、すでにリリースしたサービスにバリデーションを追加する場合、既にあちこちにそのモデルの更新処理があったりして、そこで全てバリデーションに引っかかるのは困る、という場合がある。

そんなときは、対処療法的だが、更新時にはバリデーションを掛けずに、新規作成時のみにバリデーションをかければ良い。これには、:on => :createオプションを使う。

以下は、:hoge属性を必須で、半角英数字のみにし、しかも、新規作成時(create)のときだけの設定方法。これをモデルに記述しておく。

class Hoge < ActiveRecord::Base
  validates_presence_of hoge, :on => :create
  validates :hoge, :format => { :with => /\A[a-zA-Z]+\z/,
      :message => "は半角英字で記入して下さい" }, :on => :create
end

参考:Ruby on Rails Guides: Active Record Validations and Callbacks

注意、これはあくまで対処療法です。このやり方だけだと、新規作成後に空白で更新できてしまいます。絶対に必要なバリデーションの場合は、影響範囲がでかくても、onを使わずに根本解決すべきです。