Recherche…


Valider la numéricité d'un attribut

Cette validation limite l'insertion de valeurs numériques uniquement.

class Player < ApplicationRecord
  validates :points, numericality: true
  validates :games_played, numericality: { only_integer: true }
end

Outre :only_integer , cet assistant accepte également les options suivantes pour ajouter des contraintes aux valeurs acceptables:

  • :greater_than - Spécifie que la valeur doit être supérieure à la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être supérieur à% {count}".
  • :greater_than_or_equal_to - Spécifie que la valeur doit être supérieure ou égale à la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être supérieur ou égal à% {count}".
  • :equal_to - Spécifie que la valeur doit être égale à la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être égal à% {count}".
  • :less_than - Spécifie que la valeur doit être inférieure à la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être inférieur à% {count}".
  • :less_than_or_equal_to - Spécifie que la valeur doit être inférieure ou égale à la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être inférieur ou égal à% {count}".
  • :other_than - Spécifie que la valeur doit être différente de la valeur fournie. Le message d'erreur par défaut pour cette option est "doit être différent de% {count}".
  • :odd - Spécifie que la valeur doit être un nombre impair si elle est définie sur true. Le message d'erreur par défaut pour cette option est "doit être impair".
  • :even - Spécifie que la valeur doit être un nombre pair si elle est définie sur true. Le message d'erreur par défaut pour cette option est "doit être pair".

Par défaut, la numéricité n'autorise aucune valeur nulle. Vous pouvez utiliser l'option allow_nil: true pour l'autoriser.

Valider l'unicité d'un attribut

Cet assistant vérifie que la valeur de l'attribut est unique juste avant que l'objet soit enregistré.

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

Il existe une option :scope que vous pouvez utiliser pour spécifier un ou plusieurs attributs utilisés pour limiter la vérification de l'unicité:

class Holiday < ApplicationRecord
  validates :name, uniqueness: { scope: :year,
    message: "should happen once per year" }
end

Il existe également une option :case_sensitive que vous pouvez utiliser pour définir si la contrainte d'unicité doit être sensible à la casse ou non. Cette option est définie par défaut sur true .

class Person < ApplicationRecord
  validates :name, uniqueness: { case_sensitive: false }
end

Valider la présence d'un attribut

Cet assistant vérifie que les attributs spécifiés ne sont pas vides.

class Person < ApplicationRecord
  validates :name, presence: true
end

Person.create(name: "John").valid? # => true
Person.create(name: nil).valid? # => false

Vous pouvez utiliser l'assistant d' absence pour valider l' absence des attributs spécifiés. Il utilise le present? méthode pour vérifier les valeurs nulles ou vides.

class Person < ApplicationRecord
  validates :name, :login, :email, absence: true
end

Remarque: Si l'attribut est boolean , vous ne pouvez pas utiliser la validation de présence habituelle (l'attribut ne serait pas valide pour une valeur false ). Vous pouvez le faire en utilisant une validation d'inclusion:

validates :attribute, inclusion: [true, false]

Saut des validations

Utilisez les méthodes suivantes si vous souhaitez ignorer les validations. Ces méthodes enregistreront l'objet dans la base de données même s'il n'est pas valide.

  • décrémenter!
  • decrement_counter
  • incrément!
  • increment_counter
  • basculer!
  • toucher
  • Tout mettre à jour
  • update_attribute
  • update_column
  • update_columns
  • update_counters

Vous pouvez également ignorer la validation lors de l'enregistrement en transmettant validate comme argument pour save

User.save(validate: false)

Valider la longueur d'un attribut

class Person < ApplicationRecord
  validates :name, length: { minimum: 2 }
  validates :bio, length: { maximum: 500 }
  validates :password, length: { in: 6..20 }
  validates :registration_number, length: { is: 6 }
end

Les options possibles de contrainte de longueur sont les suivantes:

  • :minimum - L'attribut ne peut pas avoir moins que la longueur spécifiée.
  • :maximum - L'attribut ne peut pas avoir plus que la longueur spécifiée.
  • :in (or :within ) - La longueur de l'attribut doit être incluse dans un intervalle donné. La valeur de cette option doit être une plage.
  • :is - La longueur de l'attribut doit être égale à la valeur donnée.

Validation groupée

Parfois, il est utile d'avoir plusieurs validations utilisant une seule condition. Cela peut être facilement réalisé en utilisant with_options.

class User < ApplicationRecord
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end

Toutes les validations à l'intérieur du bloc with_options auront automatiquement passé la condition si:: is_admin?

Validations personnalisées

Vous pouvez ajouter vos propres validations en ajoutant de nouvelles classes héritant d' ActiveModel::Validator ou d' ActiveModel::EachValidator . Les deux méthodes sont similaires mais fonctionnent différemment:

ActiveModel::Validator et validates_with

Implémentez la méthode validate qui prend un enregistrement en argument et effectue la validation sur celui-ci. Ensuite, utilisez validates_with avec la classe sur le modèle.

# app/validators/starts_with_a_validator.rb
class StartsWithAValidator < ActiveModel::Validator
  def validate(record)
    unless record.name.starts_with? 'A'
      record.errors[:name] << 'Need a name starting with A please!'
    end
  end
end
 
class Person < ApplicationRecord
  validates_with StartsWithAValidator
end

ActiveModel::EachValidator et validate

Si vous préférez utiliser votre nouveau validateur en utilisant la méthode validate commune sur un seul paramètre, créez une classe héritant d' ActiveModel::EachValidator et implémentez la méthode validate_each qui prend trois arguments: record , attribute et value :

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || 'is not an email')
    end
  end
end
 
class Person < ApplicationRecord
  validates :email, presence: true, email: true
end

Plus d'informations sur les guides Rails .

Valide le format d'un attribut

Validez que la valeur d'un attribut correspond à une expression régulière utilisant le format et l'option with .

class User < ApplicationRecord
  validates :name, format: { with: /\A\w{6,10}\z/ }
end

Vous pouvez également définir une constante et définir sa valeur sur une expression régulière et la transmettre à l'option with: :. Cela pourrait être plus pratique pour les expressions régulières très complexes

PHONE_REGEX = /\A\(\d{3}\)\d{3}-\d{4}\z/
validates :phone, format: { with: PHONE_REGEX }

Le message d'erreur par défaut is invalid . Cela peut être changé avec l'option :message .

validates :bio, format: { with: /\A\D+\z/, message: "Numbers are not allowed" }

L'inverse répond également, et vous pouvez spécifier qu'une valeur ne doit pas correspondre à une expression régulière avec l'option without:

Valide l'inclusion d'un attribut

Vous pouvez vérifier si une valeur est incluse dans un tableau en utilisant l' inclusion: helper. L'option :in et son alias :within indiquent l'ensemble des valeurs acceptables.

class Country < ApplicationRecord
  validates :continent, inclusion: { in: %w(Africa Antartica Asia Australia
                                            Europe North America South America) }
end

Pour vérifier si une valeur n'est pas incluse dans un tableau, utilisez l' exclusion: helper

class User < ApplicationRecord
  validates :name, exclusion: { in: %w(admin administrator owner) }
end

Validation conditionnelle

Parfois, vous devrez peut-être valider un enregistrement uniquement sous certaines conditions.

class User < ApplicationRecord
  validates :name, presence: true, if: :admin? 

  def admin?
    conditional here that returns boolean value
  end
end

Si vous êtes conditionnel, vous pouvez utiliser un Proc:

class User < ApplicationRecord
  validates :first_name, presence: true, if: Proc.new { |user| user.last_name.blank? }
end

Pour conditionnel négatif, vous pouvez utiliser à unless :

class User < ApplicationRecord
  validates :first_name, presence: true, unless: Proc.new { |user| user.last_name.present? }
end

Vous pouvez également passer une chaîne, qui sera exécutée via instance_eval :

class User < ApplicationRecord
  validates :first_name, presence: true, if: 'last_name.blank?'
end

Confirmation de l'attribut

Vous devez l'utiliser lorsque vous avez deux champs de texte qui doivent recevoir exactement le même contenu. Par exemple, vous souhaiterez peut-être confirmer une adresse e-mail ou un mot de passe. Cette validation crée un attribut virtuel dont le nom est le nom du champ à confirmer avec _confirmation ajouté.

class Person < ApplicationRecord
  validates :email, confirmation: true
end

Remarque Cette vérification est effectuée uniquement si email_confirmation n'est pas nul.

Pour demander une confirmation, veillez à ajouter un contrôle de présence pour l'attribut de confirmation.

class Person < ApplicationRecord
  validates :email,      confirmation: true
  validates :email_confirmation, presence: true
end

La source

Utiliser: en option

L'option :on vous permet de spécifier quand la validation doit avoir lieu. Le comportement par défaut de tous les assistants de validation intégrés doit être exécuté lors de l'enregistrement (à la fois lorsque vous créez un nouvel enregistrement et lorsque vous le mettez à jour).

class Person < ApplicationRecord
  # it will be possible to update email with a duplicated value
  validates :email, uniqueness: true, on: :create
 
  # it will be possible to create the record with a non-numerical age
  validates :age, numericality: true, on: :update
 
  # the default (validates on both create and update)
  validates :name, presence: true
end


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow