Je suppose que vous utilisez l' date_select
assistant pour générer les balises pour la date. Une autre façon de le faire est d'utiliser l'assistant de sélection de formulaire pour les champs jour, mois et année. Comme ceci (l'exemple que j'ai utilisé est le champ de date created_at):
<%= f.select :month, (1..12).to_a, selected: @user.created_at.month %>
<%= f.select :day, (1..31).to_a, selected: @user.created_at.day %>
<%= f.select :year, ((Time.now.year - 20)..Time.now.year).to_a, selected: @user.created_at.year %>
Et dans le modèle, vous validez la date:
attr_accessor :month, :day, :year
validate :validate_created_at
private
def convert_created_at
begin
self.created_at = Date.civil(self.year.to_i, self.month.to_i, self.day.to_i)
rescue ArgumentError
false
end
end
def validate_created_at
errors.add("Created at date", "is invalid.") unless convert_created_at
end
Si vous recherchez une solution de plugin, je vérifierais le plugin validates_timeliness . Cela fonctionne comme ceci (à partir de la page github):
class Person < ActiveRecord::Base
validates_date :date_of_birth, on_or_before: lambda { Date.current }
# or
validates :date_of_birth, timeliness: { on_or_before: lambda { Date.current }, type: :date }
end
La liste des méthodes de validation disponibles est la suivante:
validates_date - validate value as date
validates_time - validate value as time only i.e. '12:20pm'
validates_datetime - validate value as a full date and time
validates - use the :timeliness key and set the type in the hash.