ruby-on-rails - Rails 模型上的无效日期时间导致 nil

标签 ruby-on-rails ruby-on-rails-3 validation activerecord

我有一个带有日期时间属性的模型。我正在尝试验证传入的 JSON,这将更新模型。但如果它是无效的日期时间,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, attribute, 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

编辑:我认为这是类型转换的问题 - 试试这个(改编自 validates :numericality 的代码):

def validate_each(record, attribute, 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

关于ruby-on-rails - Rails 模型上的无效日期时间导致 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13036550/

相关文章:

ruby-on-rails - 比较 Rails 中不同区域的日期时间/时间的问题

ruby-on-rails-3 - 使用自定义处理程序的 Rails 部分模板正在转义 html

node.js - 为什么 Mongoose 不验证空文档?

ruby-on-rails - 替换查找[ :all] in Rails 3

ruby-on-rails - 无法将类从我的 gem 加载到我的 Rails 应用程序

ruby-on-rails - 在 Rails 3 中跨多个子域删除 session Cookie

jquery - 如何使用 jQuery 和 UJS 通过 AJAX 以 RJS 方式加载 HTML

ruby-on-rails - 自定义验证器测试 - 包含错误?

javascript - 验证名字和姓氏

mysql - 如何在 Rails 脚手架中指定 BIGINT?