2011-03-25 13 views
21

¿Cuál es la diferencia entre validates :presence y validates_presence_of? Mirando a través de ActiveModel parece que configuran la validación de la misma manera. Sin embargo, dado el modelo siguiente definición:Rails 3: valida: presence => true vs validates_presence_of

class Account < ActiveRecord::Base 
    has_one :owner_permission, :class_name => 'AccountPermission', :conditions => { :owner => true, :admin => true } 
    has_one :owner, :class_name => 'User', :through => :owner_permission, :source => :user 

    validate :owner, :presence => true 
    validates_associated :owner 
end 

Calling ahorrar en una instancia de Account no valida la presencia del propietario. Sin embargo, si uso validates_presence_of, lo hará.

Respuesta

21

Todas esas macros validates_whatever_of :attr hacen es llamar validates :attr, :whatever => true.

El problema es que está utilizando validate y no validates.

+1

Gracias. Me siento realmente tonto ahora. –

+1

Puedo unirme :) –

+1

¿Pero por qué en libros como 'Desarrollo web ágil con rieles' no hay mención a' validates_whatever_of' modo de validación, todos los ejemplos de validación se hacen usando 'validates: attr,: whatever => true'? – Ansd

18

En Rails 3.xy 4.x - ahora se anima a utilizar la siguiente sintaxis:

validates :email, presence: true 
validates :password, presence: true 

En lugar de la forma 2.x:

validates_presence_of :email 
validates_presence_of :password 
+0

Cabe destacar (como @mlibby lo hizo anteriormente) que los Rails2 'validates_ *' son más eficientes porque llaman 'validates_with' con el validador apropiado de inmediato en lugar de analizar los argumentos e intentar diferentes validadores Compare [la forma de Rails2] (https://github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/presence.rb#L34-L36) con [la ruta Rails3 +] (https: // github.com/rails/rails/blob/master/activemodel/lib/active_model/validations/validates.rb#L104-L125). – Dennis

0

En valida hecho y validates_presence_of no es del todo igual!

validates_presence_of le permite comprobar también de forma perezosa mediante el ejemplo del valor en el campo que se incluye en otra tabla.

Al igual que:

validates_presence_of :pay_type, :inclusion => PaymentType.names 

que es algo que no se puede hacer con la misma facilidad con algo así

validates :pay_type, presence, :inclusion => PaymentType.names 

Porque la inclusión sólo se evalúa la primera vez (no de una manera perezosa)

0

Hubiera pensado que es apropiado usar validates :foo presence: true cuando desee incluir otras validaciones de :foo, como longitud o uniq ueness. Pero si sabe que la única validación que necesitará para un atributo es su presencia, entonces validates_presence_of parece ser más eficiente.

Así:

validates :foo, length: {maximum: 50}, uniqueness: true, 
       format: {with: /bar/}, 
       presence: true # lots of validations needed 

Pero:

validates_presence_of :foo # only presence validation needed 
Cuestiones relacionadas