validar rails formularios campos asociaciones anidados ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

ruby-on-rails - formularios - rails asociaciones



omitir cierto método de validación en el Modelo (4)

Estoy usando Rails v2.3

Si tengo un modelo :

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

Como puede ver arriba, tengo 3 métodos de validación personalizados , y los utilizo para la validación del modelo.

Si tengo otro método en esta clase de modelo, guarde una nueva instancia del modelo de la siguiente manera:

# "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

Me gustaría omitir la validación de method_2 en este método particular para guardar autos nuevos, ¿cómo omitir el cierto método de validación?


Actualiza tu modelo a esto

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

Luego, en su controlador ponga:

def save_special_car new_car=Car.new(skip_method_2: true) new_car.save end

Si obtiene :flag variable params en su controlador, puede usar

def save_special_car new_car=Car.new(skip_method_2: params[:flag].present?) new_car.save end


Dependiendo de la bandera del clima, es verdadero de falso, use el método save(false) para saltear la validación.


El uso básico de la validación condicional es:

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

Consulte los documentos para obtener más detalles.

Ajustándolo a su screnario:

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


Use bloque en su validación algo así como:

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