考虑情景,
User model with name, birth_date fields
(此处birth_date是可选的)
内部视图表单birth_date被指定为'31 / 31/1985',无效
理想情况下,用户对象应该是无效的,并且在birth_date字段上引发错误但是没有发生,并且用户对象以birth_date保存为空白,这完全是误导。
调试后发现,在分配属性birth_date值时,它被指定为空白,而birth_date是可选对象被保存。
u = User.new
# invalid date assignment
u.birth_date = '31/31/2011'
u.birth_date #=> nil
# valid date assignment
u.birth_date = '1/1/2011'
u.birth_date #=> Sat, 01 Jan 2011
class User < ActiveRecord::Base
def initialize(args={})
logger.info args[:birth_date] #invalid value comes upto here but vanishes afterwords
super
end
end
我不是说它不正确,但它不应该误导用户的观点。 输入无效的birth_date用户后,bcz会假设他输入了正确的birth_date,但实际上他的birth_date根本没有保存。
任何线索如何解决这个问题??
答案 0 :(得分:1)
我不知道allow_blank
和allow_nil
选项是否适用于自定义验证,但您可以自行编写。
validate :valid_birth_date
private
def valid_birth_date
errors.add(:birth_date, "is invalid.") unless birth_date.blank? || valid_date?(birth_date)
end
def valid_date?(date)
begin
!!Date.parse(date)
rescue
false
end
end