¿Cómo no convertir una cadena a 0 mientras el usuario hace una entrada incorrecta en Ruby en Rails 6?

Tengo un modelo en el que quiero validar el número de endurecimientos que hizo el usuario. Debe ser sólo un entero no negativo. El problema es que cuando introduzco una cadena, automáticamente sustituye una cadena con 0 mientras ahorra antes de aplicar la expresión regular. ¿Cómo forzar una entrada a ser sólo un entero no negativo sin convertir una cadena a 0?

class User < ApplicationRecord
  validates :number_of_tightenings, format: { with: /\A[0-9]+\z/,
    message: "You have to input a number >= 0." }
end

Pregunta hecha hace 3 años, 4 meses, 29 días - Por compilercaptain7dab


3 Respuestas:

  • Podrías usar la validación numérica de ActiveRecord. ()https://edgeguides.rubyonrails.org/active_record_validations.html#numericality)

    class User < ApplicationRecord
      validates :number_of_tightenings,
        numericality: { only_integer: true, greater_than_or_equal_to: 0 }
    end
    
    # schema.rb
    t.integer "number_of_tightenings"
    

    only_integer especifica que el indeet de la cáscara es un entero (no un flotador). greater_than_or_equal_to especifica que no se permite ningún entero negativo. Esto generaría el siguiente comportamiento:

    User.create(number_of_tightenings: 4) #=> 
    User.create(number_of_tightenings: "5") #=> 
    User.create(number_of_tightenings: "-5") #=> , @messages={:number_of_tightenings=>["must be greater than or equal to 0"]}, @details={:number_of_tightenings=>[{:error=>:greater_than_or_equal_to, :value=>-5, :count=>0}]}>
    User.create(number_of_tightenings: "test") #=> , @messages={:number_of_tightenings=>["is not a number"]}, @details={:number_of_tightenings=>[{:error=>:not_a_number, :value=>"test"}]}>
    

    Respondida el Dec 16, 2020 a las 11:08 - por csscraftsman

    Votos positivos: 0 | Votos negativos: 0

  • Para validar que el usuario introduzca un número entero no negativo sin que una cadena se convierta automáticamente en 0, puedes hacer lo siguiente:

    • Utiliza una validación personalizada en lugar de utilizar la validación de formato. De esta manera, puedes manejar el caso en el que el usuario ingrese una cadena en lugar de un número.
    • En la validación personalizada, verifica si la entrada del usuario es un número entero. Si lo es, verifica si es mayor o igual a cero. Si no es un número entero o es un número negativo, muestra un mensaje de error apropiado.

    Aquí te dejo un ejemplo de cómo podrías modificar tu modelo User en Ruby on Rails 6:

    ruby
    class User < ApplicationRecord
      validate :validate_number_of_tightenings
    
      private
    
      def validate_number_of_tightenings
        if number_of_tightenings.present?
          unless number_of_tightenings.to_i.to_s == number_of_tightenings && number_of_tightenings.to_i >= 0
            errors.add(:number_of_tightenings, "You have to input a number >= 0.")
          end
        end
      end
    end
    

    Con esta validación personalizada, ahora se verifica si la entrada del usuario es un número entero y si ese número es mayor o igual a cero. Si la entrada no cumple con estas condiciones, se mostrará un mensaje de error apropiado.

    Espero que esta explicación te haya sido útil. Si tienes alguna otra pregunta o duda, ¡estaré encantado de ayudarte!

    Respondida el Dec 17, 2020 a las 11:11 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para evitar que una cadena se convierta automáticamente a 0 cuando se introduce una entrada no válida en Ruby on Rails 6, puedes utilizar el siguiente código:

    ruby
    class User < ApplicationRecord
      validates :number_of_tightenings, numericality: { greater_than_or_equal_to: 0, only_integer: true }
    end
    

    Este código utiliza la validación numericality con las opciones greater_than_or_equal_to y only_integer. Esto garantiza que el valor de number_of_tightenings sea un número entero no negativo.

    Cuando el usuario introduce una cadena, Rails ya no la convertirá automáticamente a 0. En su lugar, la validación fallará y se mostrará el mensaje de error "You have to input a number >= 0.".

    Además, puedes personalizar el mensaje de error utilizando la opción message. Por ejemplo:

    ruby
    validates :number_of_tightenings, numericality: { greater_than_or_equal_to: 0, only_integer: true,
      message: "The number of tightenings must be a non-negative integer." }
    

    Respondida el Dec 17, 2020 a las 11:23 - por Gemini

    Votos positivos: 0 | Votos negativos: 0