不能以“创造”的方法来覆盖对象属性
问题描述:
我有用于存储用户的一个简单的表占了另外两列信息(电子邮件和密码):不能以“创造”的方法来覆盖对象属性
- IS_ACTIVE - 如果用户帐户被启用或禁用的说 - 列 类型是布尔和在DB2的上下文中,被映射有 十进制(1)
- REGISTRATION_DATE - 说,当用户创建 - 列 类型是日期时间并在上下文ofDB2它被映射与 日期时间
作为该字段将不会由用户来设置,从用户_form我已删除他们的输入。
我想如下来填充这个领域中我的用户控制器:
def create
@security_user = SecurityUser.new(params[:security_user])
@security_user.is_active = 0
@security_user.registration_date = DateTime.now
...
end
但我不能通过,我在模型中的验证。他们看起来像:
class SecurityUser < ActiveRecord::Base
# Loading custom validators
require 'lib/date_format_validator'
...
# Accessible columns
...
# Relationships
...
# Validations
validates :is_active, inclusion: { in: 0..1, message: "only '0' and '1' allowed"}, presence: true
validates :registration_date, date_format:true , presence: true
end
其中 '的lib/date_format_validator' 看起来如下:
class DateFormatValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
if (DateTime.parse(value) rescue ArgumentError) == ArgumentError
object.errors[attribute] << (options[:message] || "is not valid datetime")
end
end
end
我做错了吗?
编辑:下面的屏幕截图显示的错误:
EDIT2:萨姆Ruby的回答可以帮助我像这样的东西来完成我的自定义的验证方法:
class DateFormatValidator < ActiveModel::EachValidator
def validate_each(object, attribute, value)
unless value.kind_of? DateTime || (DateTime.parse(value) rescue ArgumentError) != ArgumentError
object.errors[attribute] << (options[:message] || "is not valid datetime")
end
end
end
,并转换is_active列的验证方法如下:
validates :is_active, inclusion: { in: [ true, false ], message: "only 'true' and 'false' allowed"}
因为它是官方文档中说:
Since false.blank? is true, if you want to validate the presence of a boolean field you should use validates :field_name, :inclusion => { :in => [true, false] }.
答
的问题是,你正在试图验证ActiveRecord的对象,如果列是String类型。但是由于您已将列定义为布尔值和日期时间,因此您要验证的内容将是TrueClass,FalseClass或ActiveSupport :: TimeWithZone类型。
换句话说,这些值已经被解析。
true
从来没有0
或1
。
DateTime.parse(DateTime.now)
总会提高ArgumentError
如果您想验证未解析的值,在控制器这样做。
+0
谢谢,我有一些困难,但你的回答可以帮助我解决我的问题。 – gotqn 2013-04-21 20:20:31
什么是实际的错误信息?我在控制器中看到你正在手动设置'is_active'和'registration_date'字段,所以我猜测它不是验证失败的'presence'部分? – jefflunt 2013-04-21 13:13:57
我有一种感觉,即使包含验证有0值,也会导致它有错误的值,因此是无效的。我能建议't'和'f'吗? – FluffyJack 2013-04-21 13:14:02
@FluffyJack字段类型是十进制(1)。您是否提供改变字段的类型并将“T”和“F”存储为“0”和“1”。另外,由于它是rails的上下文中的布尔类型,所以它在表单中显示为值为“0”和“1”的复选框。 – gotqn 2013-04-21 13:21:26