好的,所以有很多关于相关主题的答案,但由于某种原因,似乎没有人对以下非常现实的问题感兴趣:
我有一个Timecard
模型,带有to_date
和from_date
字段。我正在使用jquery.ui.datepicker
,一般来说 - 一切都很好。我也在使用 'validates_timeliness' gem:
class Timecard < ActiveRecord::Base
...
validates_date :to_date
validates_date :from_date
...
end
但是,如果用户决定手动编辑文本字段,输入类似“2013 年 2 月 29 日”(这是一个无效日期),则该日期将转换为“2013 年 3 月 1 日”。以下规范将失败:
describe "POST #create" do
...
context "with invalid attributes (invalid date)" do
it "re-renders the :new template" do
timecard = fix_date_attribs_for(:timecard_feb)
# Manually create an invalid date in the params hash - Feb only has 28 days
timecard['to_date(3i)'] = 29
post :create, timecard: timecard
response.should render_template :new
end
end
...
end
timecards_controller.rbputs
中的以下内容:
def create
@timecard = Timecard.new(timecard_params)
puts ">>>> #{@timecard.valid?} - #{@timecard.to_yaml}"
...
end
运行上述规范时产生以下输出:
.>>>> true - --- !ruby/object:Timecard
attributes:
id:
name: February 2013
from_date: 2013-02-01
to_date: 2013-03-01
created_at:
updated_at:
F
Failures:
1) TimecardsController POST #create with invalid attributes (invalid date) re-renders the :new template
Failure/Error: response.should render_template :new
expecting <"new"> but rendering with <[]>
# ./spec/controllers/timecards_controller_spec.rb:65:in `block (4 levels) in <top (required)>'
Finished in 0.28495 seconds
17 examples, 1 failure
我如何在这里进行输入验证?在模型中使用回调似乎太遥远了(因为问题发生在之前 - 当控制器发生时@timecard = Timecard.new(timecard_params)
)。我可以尝试Date.new(relevant_timecard_params)
在控制器中捕获异常,但它无法访问errors
哈希,因此我无法告诉用户这是无效日期,更不用说控制器听起来不正确进行输入验证的地方...请帮助...
更新 1
使用下面@Grantovich 建议的“validate_timeliness”(启用插件),save
并且update
即使没有validates_date :to_date
在模型中写入,也会因无效日期(例如“2013 年 2 月 29 日”)而失败。当添加validates_date
,save
和update
fail 并且验证字段设置为nil
完全有效的输入时(我怀疑是通过验证逻辑)。
还尝试指定格式:validates_date :to_date, format: 'dd-mmm-yyyy'
但得到了相同的结果。