Está en la página 1de 4

Los siguientes mtodos disparan validaciones, y guardarn un objeto en la base de da

tos solo si el objeto es vlido:


create
create!
save
save!
update
update!
Las versiones bang (ej: save!) lanzan una excepcin si el registro es invlido. Las
versiones no-bang no, save y update retornan false, y create solo retorna el obj
eto.
1.3 Saltando las Validaciones
Los siguientes mtodos saltan validaciones, y guardarn el objeto en la base de dato
s sin tener en cuenta su validez. Deben ser utilizados con precaucin.
decrement!
decrement_counter
increment!
increment_counter
toggle!
touch
update_all
update_attribute
update_column
update_columns
update_counters
Nota que save tambin tiene la posibilidad de saltar validaciones si se le pasa de
argumento validate: false. Esta tcnica debe ser utilizada con precaucin.
save(validate: false)
1.4 valid? e invalid?
Para verificar si un objeto es o no vlido, Rails utiliza el mtodo valid?. Tambin pu
edes utilizar este mtodo por ti mismo. valid? dispara tus validaciones y retorna
true si no fueron encontrados errores en el objeto, y false de lo contrario. Com
o puedes ver aqu::
class Person < ActiveRecord::Base
validates :name, presence: true
end
Person.create(name: "John Doe").valid? # => true
Person.create(name: nil).valid? # => false
Despus de que Active Record ha ejecutado las validaciones, cualquier error encont
rado puede ser conocido a travs de la instancia del mtodo errors.messages, el cual
retorna una coleccin de errores. Por definicin, un objeto es vlido si la coleccin e
st vacia despus de ejecutar las validaciones.
Nota que un objeto instanciado con new no reportar errores mientras sea solo inst
anciado anque sea tcnicamente invlido, porque las validaciones no sern ejecutadas c
uando utilizas new.
class Person < ActiveRecord::Base
validates :name, presence: true
end
>> p = Person.new
# => #<Person id: nil, name: nil>
>> p.errors.messages

# => {}
>> p.valid?
# => false
>> p.errors.messages
# => {name:["can't be blank"]}
>> p = Person.create
# => #<Person id: nil, name: nil>
>> p.errors.messages
# => {name:["can't be blank"]}
>> p.save
# => false
>> p.save!
# => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
>> Person.create!
# => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
invalid? es simplemente la inversa de valid?. Dispara las validaciones, retornan
do true si cualquier error es encontrado en el ojbeto, y false en caso contrario
.
1.5 errors[]
Para verificar si un atributo en particular de un objeto es vlido, lo puedes veri
ficar utilizando errors[:attribute]. Esto retornar un un array de totos los error
es por :attribute. Si no hay errores en un attributo especfico, es devuelto un ar
ray vacio.
Este mtodo es solo utilizado despus de que las validaciones se han ejectuado, porq
ue solo inspecciona la coleccin de errores y no disparan validaciones por si mism
os. Esto es diferente desde el mtodo ActiveRecord::Base#invalid? que explicamos a
ntes porque este no verifica la validez del objeto no tiene ese objetivo. Solo c
omprueba para ver si hay errores encontrados en un atributo individual del objet
o.
class Person < ActiveRecord::Base
validates :name, presence: true
end
>> Person.new.errors[:name].any? # => false
>> Person.create.errors[:name].any? # => true
Cubriremos los errores de validacin en mayor profundidad en la seccin Trabajando c
on los errores de validacin. Por ahora, vamos a continuar con los helpers (ayudan
tes) de validacin construidos que Rails provee por defecto.
2 Helpers de Validacin
Active Record ofrece muchos helpers de validacin predefinidos que puedes utilizar
directamente dentro de las definiciones de tu clase. Estos helpers proveen las
reglas de validacin comunes. Cada vez que una validacin falla, un mensaje de error
es aadido a la coleccin de errors del objeto, y este mensaje es asociado con el a
ttributo que est siendo validado.
Cada ayudante acepta un nmero arbitrario de nombres de atributos, entonces con un
a simple lnea de cdigo puedes aadir algn tipo de validadacin a varios atributos.
Todos ellos acceptan las opciones :on y :message, las cuales definen cuando la v
alidacin se ejecuta y el mensaje que debera ser aadido a la coleccin errors si falla
, respectivamente. La opcin :on toma uno de los valores :create o :update. Hay un

mensaje de error por defecto pra cada una de los helpers de validacin. Estos men
sajes son utilizados cuando la opcin :message no est especificada. Vamos a repasar
cada uno de los helpers disponibles.
2.1 acceptance
Este mtodo valida si un checkbox en la interfaz de usuarios es chequeado al envia
r un formulario. Esto es tpicamente utilizado cuando el usuario necesita dar su c
onformidad sobre los trminos y servicios de tu aplicacin, confirmndolo despus de lee
r algn texto o algo por el estilo. Esta validacin es muy especfica para aplicacione
s web y esta 'acceptance' no necesita guardarse en ningn sitio de tu base de dato
s (si no tienes un campo para esto, el helper crear un attributo virtual).
class Person < ActiveRecord::Base
validates :terms_of_service, acceptance: true
end
El mensaje de error por defecto de este helper es "must be accepted".
Puede recibir una opcin :accept, la cual determina que valor que ser considerado a
ceptable. Por defecto es "1" y puede ser cambiado facilmente.
class Person < ActiveRecord::Base
validates :terms_of_service, acceptance: { accept: 'yes' }
end
2.2 validates_associated
Deberas utilizar este helper cuando tu modelo tiene asociaciones con otros modelo
s y tambin necesiten ser validados. Cuando intentas guardar tu objeto valid? ser
llamado por cada uno de los objetos asociados.
class Library < ActiveRecord::Base
has_many :books
validates_associated :books
end
Esta validacin trabajar con todos los tipos de asociaciones.
No utilices validates_associated en ambas puntas de tus asociaciones, porque se
llamarn la una a la otra en un ciclo infinito.
El mensaje de error por defecto para validates_associated es "is invalid". Nota
que cada objeto asociado contendra sus propias colecciones errors; los errores n
o escalan hacia el modelo llamadado.
2.3 confirmation
Puedes utilizar este helper cuando tengas dos campos de texto que deban recibir
exactamente el mismo contenido. Por ejemplo, puedes querer confirmar una direcci
on de email y un password. Esta validacin crea un atributo virtual cuyo nombre es
el campo que tiene que ser confirmado con la "_confirmation" aadida.
class Person < ActiveRecord::Base
validates :email, confirmation: true
end
En la plantilla de la vista podras utilizar algo como
<%= text_field :person, :email %>
<%= text_field :person, :email_confirmation %>
Esta comprobacin se lleva a cabo solo si email_confirmation no esnil. Para requer
ir confirmacin, asegurate de aadir una comprobacin presence al atributo de confirma
cin (veremos presence ms adelante en esta gua):
class Person < ActiveRecord::Base
validates :email, confirmation: true

validates :email_confirmation, presence: true


end
El mensaje de error para este ayudante es "do
esn't match confirmation".
2.4 exclusion
Este helper valida que los valores de los atr
ibutos no estn incluidos en una configuracin
dada. En realidad, esta configuracin puede
ser cualquier objeto enumerable.
class Account < ActiveRecord::Base
validates :subdomain, exclusion: { in: %w(w
ww us ca jp),
message: "%{value} is reserved." }
end
El helper exclusion tiene una opcin :in que
recibe la configuracin de los valores que no
sern aceptados por los atributos validados.
La opcin :in tiene un alias llamado :withi
n que puedes utilizar para el mismo propsit
o, si lo quieres. Este ejemplo utiliza la op
cin :message para mostrar como puedes inclu
ir los valores de los atributos.
El mensaje de error por defecto es "is reser
ved".
2.5 format
Este helper valida los valores de los atribut
os por pruebas si coinciden o no con una expr
esin regular dada, que se especifica utiliza
nd
o la opcin :with.
class Product < ActiveRecord::Base
validates :legacy_code, format: { with: /\
A[a-zA-Z]+\z/,
message: "only allows letters" }
end
Alternativamente, puedes requerir que el at
ributo especfico que no responda a la expre
sin regular utilizando la opcin :without.
El mensaje de error por defecto es "is inva
lid".
2.6 inclusion
Este helper valida que los valores de los at
ributos estn incluidos en una configuracin
dada. En realidad, esta configuracin pued
e ser un objeto enumerable.
class Coffee < ActiveRecord::Base
validates :size, inclusion: { in: %w(small
medium large),
message: "%{value} is not a valid size" }