以这种方式这可能是不可能的。但是,在我的数据库模式中,我的anticipated_arrival_date
文件中有一个名为t.date
的字段schema.rb
。
我目前正在使用jQuery来抓取三个不同的<select>
字符串,并将它们连接成一个字符串,用以下格式"dd/mm/yyyy"
表示日期。我通过以下方式执行此操作:
$("#arrival_year").blur(function(){
var month = $('#arrival_month').val();
var day = $('#arrival_day').val();
var year = $('#arrival_year').val();
if (month == "" || day=="" || year==""){
}
else{
//DD/MM/YYYY
combined = String(day) + "/" +String(month)+"/"+ String(year);
var arrival_date = $('#school_application_anticipated_arrival_date');
arrival_date.val(combined);
}
});
其中#school_application_anctipated_arrival_date
是我的模型上的t.date
字段,我在f.hidden_field
中将<form>
作为undefined method `<=' for nil:NilClass
if record.anticipated_arrival_date != nil and ((record.start_date <= record.anticipated_arrival_date) or ((record.start_date - record.anticipated_arrival_date).to_i >= 7))
。问题是,当我通过POST请求提交表单时,我收到以下错误:
ancitipated_arrival_date
在我的anticipated_arrival_date
验证中抛出。简而言之,它是t.date
未定义。
是否A)以某种方式可以在调用create
时从字符串中生成有效的anticipated_arrival_date
?如果没有,有没有办法,假设将date
迁移到字符串而不是anticipated_arrival_date
,我可以在从date
到另一列的验证中进行安全比较。真正的strftime
列?例如,在date
列上使用class AnticipatedArrivalDateValidator < ActiveModel::Validator
def validate(record)
if record.anticipated_arrival_date != nil and ((record.start_date <= record.anticipated_arrival_date) or ((record.start_date - record.anticipated_arrival_date).to_i >= 7))
record.errors[:base] << "Cannot have arrival date be later or equal to start date for Early Night Arrival."
end
end
end
?
这是我完整的控制器文件:
https://gist.github.com/anonymous/9f31c26f6c38fe3e21bb
以下是执行验证的模型文件的摘录:
before_action
注意:在参考评论中,我尝试通过以下before_action :cleanup_date_params
def cleanup_date_params
if params[:school_application]
anticipated_string = params[:school_application][:anticipated_arrival_date]
params[:school_application][:anticipated_arrival_date] = Date.parse(anticipated_string)
Rails.logger.debug(Date.parse(anticipated_string))
end
end
undefined method `<=' for nil:NilClass
问题是这仍然导致错误:
before_action
在我的验证中调用了同一行。
我认为,params[:school_application][:anticipated_arrival_date]
并未更改.create
,因为在params[:school_application]
的强参数版本上调用了before_action
,因此必须覆盖我设置的参数sed "s/Read/\n/g" /tmp/Air/test.txt | tail -1 test.txt | grep ARP
。我不知道如何解决这个问题。
答案 0 :(得分:2)
使用to_date函数将字符串转换为日期并比较模型验证中的日期而不是字符串。
2.1.5 :006 > date = "02/03/2016"
=> "02/03/2016"
2.1.5 :007 > changed_date = date.to_date
=> Wed, 02 Mar 2016
def create
object = object_params
object[:date] = object[:date].to_date
/** code of cretae **/
end
&#13;
然后使用验证。 refer to this link
答案 1 :(得分:1)
更改
combined = String(day) + "/" +String(month)+"/"+ String(year);
要
combined = new Date(year, month, day);
Rails应该处理将此格式转换为date
。