2011-03-13 72 views
0

在我的表单中,我希望用户以DD/MM/YYYY格式输入日期。我有验证,检查。Rails 3验证问题

的问题是,在数据库中它被保存在YYYY-MM-DD格式,因此,如果尝试只是为了更新is_money_paid领域:

job = Job.find(params[:id]) 
job.update_attributes(:is_money_paid => ...) 

验证失败说,工作的日期格式错误(YYYY-MM-DD而不是DD/MM/YYYY)。

什么是解决此问题的适当方法?

下面是相关代码:

class Job < ActiveRecord::Base 
    validate :job_date_validator 
end 

DATE_REGEX = /\A\d{2}\/\d{2}\/\d{4}\z/ 

def job_date_validator 
    if job_date_before_type_cast.blank? 
    errors.add(:job_date, "^Date must be selected") 
    elsif job_date_before_type_cast !~ DATE_REGEX 
    errors.add(:job_date, "^Date must be in DD/MM/YYYY format") 
    end 
end 

is_money_paid是一个布尔字段。

+0

1.显示您的验证码; 2.什么'is_money_paid'列类型是 – fl00r 2011-03-13 13:32:06

+0

也许你可以在before_validation中打开日期? – 2011-03-13 13:45:44

+0

我用更多的信息更新了这个问题。 – 2011-03-14 03:51:01

回答

1

我会改变验证说:

validate_presence_of :job_date, :message => "must be selected" 
validate :job_date_validator, :if => :job_date_changed? 

或者类似的规定。

您可以取出.blank?也检查。

+0

'job_date_before_type_cast_changed?'应该做什么?是Rails方法,还是我应该定义它? – 2011-03-14 04:18:19

+0

假设'job_date_before_type_cast'是模型数据库中的一个属性,那么rails为你定义了'* _changed?'方法,如果该字段已被更改但返回true,但该值尚未保存到数据库。 – nzifnab 2011-03-14 04:41:33

+0

实际上,'job_date'是属性的名称。 'job_date_before_type_cast'由Rails创建。你能给我一个指向'* _changed?'文档的指针吗? – 2011-03-14 04:58:08

0
+0

但是,如果我在'before_validation'中将** YYYY-MM-DD **的日期转换为** DD/MM/YYYY **,则用户将能够在** YYYY-MM- DD **格式。不是吗? – 2011-03-14 03:46:48

+0

不知道我关注。这不会影响用户可以输入的内容,而只会影响保存的内容。如果你想让UI始终以特定的格式显示,那么你应该在显示层使用辅助方法。 – 2011-03-14 05:12:31

0

我建议你看看与rails 3兼容的gem 。