我想在模型中验证我的日期(实际上有DATE类型)。所以,我尝试为该simle方法编写并通过验证运行它。
Teacher
class Teacher < ActiveRecord::Base
attr_accessible :teacher_birthday # DATE type!
belongs_to :user
validates :teacher_birthday, :presence => true,
:unless => :date_is_correct?
########
def date_is_correct?
parsed_data = Date._parse(:teacher_birthday)
input_day = parsed_data[:mday]
input_month = parsed_data[:mon]
input_year = parsed_data[:year]
correct_days = 1..31
correct_months = 1..12
correct_year = 1900..2000
if ( correct_days.member? input_day ) and ( correct_months.member? input_month) and
( correct_year.member? input_year)
true
else
errors.add(:teacher_birthday, 'date is invalid')
false
end
end
当我运行rspec时,很多测试都失败了。
TypeError: can't convert Symbol into String
# ./app/models/teacher.rb:56:in `_parse'
# ./app/models/teacher.rb:56:in `date_is_correct?'
我想我做错了什么。谁能告诉我有什么问题?
答案 0 :(得分:0)
这根本不是必需的。如果Date.parse(:teacher_birthday)返回日期并且没有引发异常,则表示您有一个有效的日期。
答案 1 :(得分:0)
Date._parse
期望包含日期的字符串值,并且代码中的字符串将始终尝试解析“teacher_birthday”。您需要先获取字段的值,然后将值传递给Date._parse
。 ActiveRecord创建与字段具有相同名称的方法以获取值。
以下任何一种都可以使用:
简短的方法
parsed_data = Date._parse(teacher_birthday)
与第一个相同(在解析期间为您添加self.
)
parsed_data = Date._parse(self.teacher_birthday)
明确的方式
parsed_data = Date._parse(self[:teacher_birthday])
答案 2 :(得分:0)
已经创建了一个新的gem以帮助validate types in rails和explanatory blog post来回答更多的&#34;为什么&#34;它是在第一时间创建的。
使用此库,您的代码很简单:
class Post < ActiveRecord::Base
validates_type :teacher_birthday, :date
end
如果将Date
以外的任何内容分配给:teacher_birthday
,则会引发异常。