2010-12-11 15 views
52

¿Cuál es la manera de implementar los rieles mínimo validador en Rails 3?¿Cómo implementar el validador mínimo/máximo en Rails 3?

Tengo un modelo, con atributos min_age y max_age.

La edad puede estar en el rango de 0..100, pero quiero también para validar los valores de paso, quiero decir que como máximo es greather o igual a min

{:min_age => 0, :max_age => 0} => true 
{:min_age => 0, :max_age => 1} => true 
{:min_age => 1, :max_age => 0} => false # max < min 
{:min_age => 1, :max_age => 101} => false # out of 0..100 range 

Respuesta

97

Mira la ActiveModel :: validaciones :: NumericalityValidator: RailsAPI NumericalityValidator

especificaciones:

it { 
    subject.max_age = 10 
    subject.min_age = 20 
    subject.should be_invalid 
    subject.errors[:min_age].should include("must be less than or equal to #{subject.max_age}") 
} 

código:

validates :min_age, numericality: { greater_than: 0, less_than_or_equal_to: :max_age } 

validates :max_age, numericality: { less_than_or_equal_to: 100 } 

No sé si quiere validar la presencia o no, pero simplemente la agregará como otra clave para sus validaciones, p.

validates :max_age, numericality: { less_than_or_equal_to: 100 }, presence: true 
+0

bien, gracias por este ejemplo !! – Robert

+0

Nota: esto funcionó bien en "crear", pero en "actualización" obtuve un error de "nivel de pila demasiado profundo" - utilizando entradas válidas - que era una bestia para encontrar. No hay idea de que este validador haya sido la causa, ya que el error no hace referencia a la línea de código antes del ciclo. – JosephK

27

También puede utilizar inclusion...in, como en:

validates :height, :inclusion => { :in => 1..3000, :message => "The height must be between 1 and 3000" } 
9
validates_numericality_of :min_age, greater_than: 0 
validates_numericality_of :max_age, less_than_or_equal_to: 100 
validates_numericality_of :max_age, greater_than: :min_age 

También puede utilizar la edad, así:

validates_numericality_of :age, less_than_or_equal_to: 100, greater_than: 0 
+0

min_age 30, max_age 10, seguirá recibiendo canal, pero no debería - mi tercera línea de código en la pregunta. – astropanic

+0

Le sugerí que use una única entrada de edad, en lugar de minimo y máximo. Una forma de resolverlo es hacer que tenga un max_age más grande que min_age. Ver mi edición No probé el código. En cualquier caso, debe tener algún código para asegurarse de que la edad mínima no sea mayor que la edad máxima. – EastsideDeveloper

+0

No puedo usar un solo atributo, porque no es una edad sino un rango de edad. Sé que necesito un código para garantizar el cruce de valores, esa fue mi pregunta. – astropanic

Cuestiones relacionadas