43 votes

Comment valider la date telle qu'elle est postérieure à aujourd'hui dans Rails ?

J'ai un modèle d'enregistrement actif qui contient des attributs : date_expiration. Comment dois-je procéder pour le valider de telle sorte qu'il soit après aujourd'hui (date actuelle à cette heure) ? Je suis totalement nouveau sur Rails et ruby et je n'ai pas trouvé de question similaire répondant exactement à cela?

J'utilise Rails 3.1.3 et ruby 1.8.7

72voto

apneadiving Points 64660

Votre question trouve (presque) exactement la réponse dans les guides Rails .

Voici l'exemple de code qu'ils donnent. Cette classe valide que la date est dans le passé , tandis que votre question est de savoir comment valider que la date est dans le futur , mais l'adapter devrait être assez facile :

 class Invoice < ActiveRecord::Base
  validate :expiration_date_cannot_be_in_the_past

  def expiration_date_cannot_be_in_the_past
    if expiration_date.present? && expiration_date < Date.today
      errors.add(:expiration_date, "can't be in the past")
    end
  end    
end

19voto

dankohn Points 6999

Voici le code pour configurer un validateur personnalisé :

 #app/validators/not_in_past_validator.rb
class NotInPastValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if value.blank?
      record.errors.add attribute, (options[:message] || "can't be blank")
    elsif value <= Time.zone.today
      record.errors.add attribute,
                        (options[:message] || "can't be in the past")
    end
  end
end

Et dans ton modèle :

 validates :signed_date, not_in_past: true

6voto

Amit Attri Points 124

La solution la plus simple et la plus efficace consiste à utiliser la validation intégrée de Rails. Il suffit de le valider comme ça :

 validates :expiry_date, inclusion: { in: (Date.today..Date.today+5.years) }

3voto

Obromios Points 53

Dans les rails 4+, il existe des future? et past? pour les DateTime , donc une réponse plus simple est

 class Invoice < ActiveRecord::Base
  validate :expiration_date_cannot_be_in_the_past

  def expiration_date_cannot_be_in_the_past
    if expiration_date.present? && expiration_date.past?
      errors.add(:expiration_date, "can't be in the past")
    end
  end    
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X