不能以“创造”的方法来覆盖对象属性

问题描述:

我有用于存储用户的一个简单的表占了另外两列信息(电子邮件和密码):不能以“创造”的方法来覆盖对象属性

  1. IS_ACTIVE - 如果用户帐户被启用或禁用的说 - 列 类型是布尔在DB2的上下文中,被映射有 十进制(1)
  2. 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 

我做错了吗?

编辑:下面的屏幕截图显示的错误:

enter image description here

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] }. 
+0

什么是实际的错误信息?我在控制器中看到你正在手动设置'is_active'和'registration_date'字段,所以我猜测它不是验证失败的'presence'部分? – jefflunt 2013-04-21 13:13:57

+1

我有一种感觉,即使包含验证有0值,也会导致它有错误的值,因此是无效的。我能建议't'和'f'吗? – FluffyJack 2013-04-21 13:14:02

+0

@FluffyJack字段类型是十进制(1)。您是否提供改变字段的类型并将“T”和“F”存储为“0”和“1”。另外,由于它是rails的上下文中的布尔类型,所以它在表单中显示为值为“0”和“1”的复选框。 – gotqn 2013-04-21 13:21:26

的问题是,你正在试图验证ActiveRecord的对象,如果列是String类型。但是由于您已将列定义为布尔值和日期时间,因此您要验证的内容将是TrueClass,FalseClass或ActiveSupport :: TimeWithZone类型。

换句话说,这些值已经被解析。

true从来没有01

DateTime.parse(DateTime.now)总会提高ArgumentError

如果您想验证未解析的值,在控制器这样做。

+0

谢谢,我有一些困难,但你的回答可以帮助我解决我的问题。 – gotqn 2013-04-21 20:20:31