Supongo que está utilizando el ayudante date_select
para generar las etiquetas para la fecha. Otra forma de hacerlo es utilizar select form helper para los campos de día, mes y año. Así (ejemplo que utiliza es el campo de fecha 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 %>
Y en el modelo, se valida la fecha:
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 usted está buscando una solución plug-in, que había presiona el plugin validates_timeliness. Funciona de la siguiente (en la página de 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 lista de métodos de validación disponibles son los siguientes:
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.
Esta pregunta es actualmente uno de los principales resultados de Google para la validación de la fecha de Rails. Puede que lo pierda en el primer pase como lo hice yo: la parte importante de la respuesta seleccionada es la gema validates_timeliness. Ni siquiera leí el resto de la respuesta porque me enteré de la validación en otra parte, y esa joya hace todo lo que necesito sin tener que escribir ningún código personalizado. –