Проще всего использовать :if
следующим образом:
class User < ActiveRecord::Base
validate_presence_of :name
validate_presence_of :age, :if => Proc.new { |user| user.signup_step >= 2 }
# ... etc
end
или
class User < ActiveRecord::Base
validate_presence_of :name
validate_presence_of :age, :if => :registering?
def registering?
signup_step >= 2
end
end
Вы также можете использовать метод validate
для определения любой сложной пользовательской логики. Например:
class User < ActiveRecord::Base
validate :has_name_and_email_after_invitation
validate :has_complete_profile_after_registration
def has_name_and_email_after_invitation
if ... # determine if we're creating an invitation
# step 1 validation logic here
end
end
def has_complete_profile_after_registration
if ... # determine if we're registering a new user
# step 2 validation logic here
end
end
end
(В приведенном выше примере вы могли бы фактически определить правила проверки в has_name_and_email_after_invitation
с помощью обычных вызовов validates_xxx_of
, поскольку они также должны применяться на шаге 2, но использование двух методов для отдельных шагов дает вам максимальную гибкость. )