J'utilise Rails v2.
Si j'ai un modèle:
class car < ActiveRecord::Base
validate :method_1, :method_2, :method_3
...
# custom validation methods
def method_1
...
end
def method_2
...
end
def method_3
...
end
end
Comme vous le voyez ci-dessus, j'ai méthodes de validation personnalisées, et je les utilise pour la validation du modèle.
Si j'ai une autre méthode dans cette classe de modèle qui enregistre une nouvelle instance du modèle comme suit:
# "flag" here is NOT a DB based attribute
def save_special_car flag
new_car=Car.new(...)
new_car.save #how to skip validation method_2 if flag==true
end
Je souhaite ignorer la validation de method_2
dans cette méthode particulière pour enregistrer une nouvelle voiture, comment ignorer la certaine méthode de validation?
Mettez à jour votre modèle en
class Car < ActiveRecord::Base
# depending on how you deal with mass-assignment
# protection in newer Rails versions,
# you might want to uncomment this line
#
# attr_accessible :skip_method_2
attr_accessor :skip_method_2
validate :method_1, :method_3
validate :method_2, unless: :skip_method_2
private # encapsulation is cool, so we are cool
# custom validation methods
def method_1
# ...
end
def method_2
# ...
end
def method_3
# ...
end
end
Ensuite, dans votre contrôleur, mettez:
def save_special_car
new_car=Car.new(skip_method_2: true)
new_car.save
end
Si vous obtenez :flag
via la variable params dans votre contrôleur, vous pouvez utiliser
def save_special_car
new_car=Car.new(skip_method_2: params[:flag].present?)
new_car.save
end
L'utilisation de base de la validation conditionnelle est la suivante:
class Car < ActiveRecord::Base
validate :method_1
validate :method_2, :if => :perform_validation?
validate :method_3, :unless => :skip_validation?
def perform_validation?
# check some condition
end
def skip_validation?
# check some condition
end
# ... actual validation methods omitted
end
Consultez la documentation pour plus de détails.
En l'adaptant à votre scénario:
class Car < ActiveRecord::Base
validate :method_1, :method_3
validate :method_2, :unless => :flag?
attr_accessor :flag
def flag?
@flag
end
# ... actual validation methods omitted
end
car = Car.new(...)
car.flag = true
car.save
Utilisez le bloc dans votre validation quelque chose comme:
validates_presence_of :your_field, :if => lambda{|e| e.your_flag ...your condition}