Tôi đoán bạn đang sử dụng trình trợ giúp date_select
để tạo thẻ cho ngày. Một cách khác bạn có thể làm đó là sử dụng trình trợ giúp biểu mẫu được chọn cho các trường ngày, tháng, năm. Như thế này (ví dụ tôi sử dụng là lĩnh vực ngày 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 %>
Và trong mô hình, bạn xác nhận ngày:
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
Nếu bạn đang tìm kiếm một giải pháp plugin, tôi muốn kiểm tra plugin validates_timeliness. Nó hoạt động như thế này (từ trang 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
Danh sách các phương pháp xác nhận có sẵn như sau:
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.
Nguồn
2009-02-28 09:14:16
Câu hỏi này hiện là một trong các kết quả hàng đầu của Google để xác thực ngày Rails. Bạn có thể bỏ lỡ nó trên pass đầu tiên như tôi đã làm: phần quan trọng của câu trả lời được chọn là gem hợp lệ_timeliness. Tôi thậm chí không đọc phần còn lại của câu trả lời vì tôi đã tìm hiểu về validates_timeliness ở một nơi khác, và đá quý đó làm mọi thứ tôi cần mà không cần phải viết bất kỳ mã tùy chỉnh nào. –