Soy bastante nuevo en Rails y encontrado un pequeño fragmento de código para validar la presencia y la singularidad paso a paso: en primer lugar comprobación de la presencia, a continuación, comprobar la unicidad.

validates :email, :presence => true, :allow_blank => true, :uniqueness => { :case_sensitive => false }

Estoy un poco confundido sobre el uso de presence => true y allow_blank => true juntos.

Sin usar allow_blank => true ambas reglas, será verificado en el mismo tiempo y no paso por paso.

¿Por qué allow_blank => true hacer esta magia?

  • en la guía oficial dice «:allow_blank es ignorado por la presencia de validación.» Tal vez te sea de ayuda.
  • también eche un vistazo a este gran respuesta
InformationsquelleAutor Slevin | 2013-01-23

6 Comentarios

  1. 28

    Lo que tienes es equivalente a la presente (ajustado para mayor claridad):

    validates :email, :presence => true, 
                :uniqueness => { :allow_blank => true, :case_sensitive => false }

    Que es un poco tonto, aunque ya que si estás requiriendo la presencia, entonces, de que va a «invalidar» la :allow_blank cláusula :la originalidad.

    Tiene más sentido cuando se cambia a la utilización de otros validadores.. decir… formato y la singularidad, pero no desea que los cheques si es en blanco. En este caso, la adición de un «globalmente aplicada» :allow_blank tiene más sentido y se SECA el código un poco.

    Este…

    validates :email, :format => {:allow_blank => true, ...}, 
                      :uniqueness => {:allow_blank => true, ...}

    puede ser escrito como:

    validates :email, :allow_blank => true, :format => {...}, :uniqueness => {...}
    • Muchas gracias! Acabo de encontrar este fragmento de código en algún lugar en stackoverflow y se convirtió en curiosidad por qué alguien debería utilizar allow_blank y presence juntos 🙂
    • puede que desee utilizar para mostrar un mensaje de error de formato no válido vs en blanco por ejemplo. Si usted no pone el allow_blank obtiene un «formato no válido» para un valor en blanco
  2. 31

    La siguiente distinción puede ser útil saber:

    presence: true                    # nil and empty string fail validation
    presence: true, allow_blank: true # nil fails validation, empty string passes
    • Es que en realidad la verdadera? Como tengo entendido el docs, allow_blank saltará validaciones en todos los valores en blanco. nil es un valor en blanco. Una prueba rápida en los Carriles 5 me dice que nil no falla mi validación…
    • Esta respuesta es super MALO! Al menos en Rails 5.
    • es correcto aquí, usted puede ver mirando las pruebas para detectar la presencia validador con el allow_blank opción: github.com/rails/rails/blob/…
    • Por favor, edite la respuesta con correcciones una vez que hayas verificado en el código lo que el comportamiento es cómo presence y allow_blank trabajar juntos. Dejé de usar Rails hace muchos años, de lo contrario me gustaría hacerlo yo mismo. Estoy confiando en la comunidad para mantener esta respuesta actualizada y confiable.
    • Para realizar este trabajo, el uso de validates :columnx, presence: true, if: Proc.new{ |x| x.columnx.nil? }, basado en edgeguides.rubyonrails.org/…
  3. 6

    :allow_blank es una opción que «deshabilitar» varios de los validadores, pero no la presencia de validación. El resultado de la utilización de estos dos juntos es que cuando el campo se deja en blanco, obtendrá la :blank mensaje de error (es decir, «no se puede estar en blanco»), pero no la de otros mensajes de error.

  4. 1

    En el código, :presence => y :uniqueness => son los validadores, mientras :allow_blank => es una opción por defecto que se le pasa a otros validadores.

    Por lo tanto el código:

    validates(
        :email,
        :presence => true,
        :allow_blank => true,
        :uniqueness => { :case_sensitive => false }
    )

    Es equivalente a este código:

    validates(
        :email,
        :presence => { :allow_blank => true },
        :uniqueness => { :allow_blank => true, :case_sensitive => false }
    )

    Sin embargo, la presence validador ignora la allow_blank opción, por lo que su código termina siendo esencialmente esto:

    validates(
        :email,
        :presence => { }, # `{ }` is equivalent to `true`
        :uniqueness => { :allow_blank => true, :case_sensitive => false }
    )

    Tener :allow_blank => true en :uniqueness significa que cuando el correo está en blanco, el uniqueness de validación no se ejecutará.

    Un efecto de esto es que se elimina una base de datos de consulta.

    E. g., sin la :allow_blank => true la condición de que iba a ver esto:

    >> user = User.new(email: nil)
    >> user.valid?
      User Exists (0.2ms) SELECT  1 AS one FROM "users" WHERE "users"."name" IS NULL LIMIT 1
    => false
    >> user.errors.messages
    => {:email=>["can't be blank"]}

    Pero con la :allow_blank => true opción de no ver que User Exists DB consulta suceder.

    Otro borde-caso de efectos secundarios que sucede cuando usted han un registro con una dirección de correo electrónico en blanco en tu DB ya. En ese caso, si no tienen la :allow_blank => true opción en la uniqueness validador, entonces usted verá los errores de dos vienen de vuelta:

    >> user = User.new(email: nil)
    >> user.valid?
      User Exists (0.2ms) SELECT  1 AS one FROM "users" WHERE "users"."name" IS NULL LIMIT 1
    => false
    >> user.errors.messages
    => {:email=>["has already been taken", "can't be blank"]}

    Pero con la :allow_blank => true opción solo podrá ver el "can't be blank" de error (debido a la singularidad de validación no se ejecutará cuando el correo electrónico está en blanco).

  5. 0

    de Rieles anotación

    # * <tt>:allow_nil</tt> - Skip validation if the attribute is +nil+.
    # * <tt>:allow_blank</tt> - Skip validation if the attribute is blank.

    así, significa que cuando utilizamos allow_blank en el correo electrónico, si el correo electrónico es nada, sólo un error añadido a errors objeto, saltar la singularidad valida.

  6. 0

    Demasiado explicar acaba de hacer simples las cosas más complicadas, vamos a decir:

    # do not use this validates to check if the value is blank

Dejar respuesta

Please enter your comment!
Please enter your name here