加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails无效的日期时间模型结果为零

发布时间:2020-12-16 19:54:44 所属栏目:百科 来源:网络整理
导读:我有一个具有datetime属性的模型.我试图验证将更新模型的传入 JSON.但是如果ActiveRecord是无效的日期时间,ActiveRecord似乎将该属性的值设置为nil.我无法使用适当的错误进行响应,因为该属性被允许为零.我究竟做错了什么? 码: class DatetimeValidator Act
我有一个具有datetime属性的模型.我试图验证将更新模型的传入 JSON.但是如果ActiveRecord是无效的日期时间,ActiveRecord似乎将该属性的值设置为nil.我无法使用适当的错误进行响应,因为该属性被允许为零.我究竟做错了什么?

码:

class DatetimeValidator < ActiveModel::EachValidator
  def validate_each(record,attribute,value)
    value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
  end
end

class Foo
   # column :my_date,:datetime
   validates :my_date,:allow_nil => true,:datetime => true
end

安慰:

1.9.3p125 :001 > x = Foo.new
=> #<Foo id: nil,my_date: nil>
1.9.3p125 :001 > x.my_date = 'bad value'
=> 'bad value'
1.9.3p125 :001 > x.my_date
=> nil
1.9.3p125 :001 > x.valid?
=> true

就ActiveRecord而言,将datetime属性设置为“bad_value”等同于将其设置为nil,因此我不能验证它,因为my_date不是必需的.这似乎是我的错误.什么是最好的解决方法?

谢谢!

解决方法

一个解决方法是将allow_nil部分移动到date_time验证中:
class DatetimeValidator < ActiveModel::EachValidator
  def validate_each(record,value)
    return if value.blank?
    value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
  end
end

class Foo
  validates :my_date,:datetime => true
end

编辑:我认为这是一个类型转换的问题 – 尝试这个(从代码验证:数字)改编:

def validate_each(record,value)
  before_type_cast = "#{attribute}_before_type_cast"

  raw_value = record.send(before_type_cast) if record.respond_to?(before_type_cast.to_sym)
  raw_value ||= value

  return if raw_value.blank?
  raw_value.to_datetime rescue record.errors[attribute] << (options[:message] || "must be a date.")
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读