web-dev-qa-db-fra.com

ignorer certaines méthodes de validation dans le modèle

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?

33
Leem.fin

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
57
shime

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
12
Michał Szajbe

Utilisez le bloc dans votre validation quelque chose comme:

validates_presence_of :your_field, :if =>  lambda{|e| e.your_flag ...your condition}
0
Ravindra