Rails で特定の条件では callback を実行したくない時は ActiveSupport::Callbacks::ClassMethods の skip_callback を使う。ドキュメントに書いてある例以外にも User の中の特定のメソッドの中、具体的には自分自身を複製するような処理で callback を除外したい時は
User.skip_callback :validate, :before, :validate_methods
と書けばよい。ただ、上記のように if を抜くと、skip と言いつつ実際には remove と同様の動きになって callback が常に消えてしまう。なので、実際に使う時は
User.skip_callback :validate, :before, :validate_methods
(snip)
User.set_callback :validate, :before, :validate_methods
というように set_callback を実行して元に戻さなくてはいけない。今日はこの動きにはまったんだけど、上のように skip_callback を使わないとダメないけない状況自体が良くないような気がするなあ。続く。