我试图在我的一个模型上使用bootstrap datepicker设置日期字段。我希望在用户选择日期后将日期格式显示为MM / DD / YYYY。问题是我的数据库(YYYY / MM / DD)的日期格式不正确,我需要在保存之前对其进行格式化。
在我的模型中,我创建了一个setter方法
def start_date=(val)
Date.strptime(val, '%Y-%m-%d')
end
当我在2014年9月23日的表单中输入日期时,收到错误消息,指出无效日期。
我做错了什么?
我的参数
{"utf8"=>"✓",
"authenticity_token"=>"***",
"event"=>{"start_date"=>"09/24/2014",
"user_id"=>"1"},
"commit"=>"Submit"
}
修改
所以稍后改变我的方法
def start_date=(val)
Date.strptime(val, "%m/%d/%Y") if val.present?
end
我不再收到“无效日期”错误。但是,现在没有日期保存到记录中。我试过了
def start_date=(val)
@start_date = Date.strptime(val, "%m/%d/%Y") if val.present?
end
正如@animatedgif所说,但仍然没有任何反应。
答案 0 :(得分:4)
所以我想出了最好的方法(我认为:P)。
我必须在我的setter中添加一个write_attribute()才能保存。
def start_date=(val)
date = Date.strptime(val, "%m/%d/%Y") if val.present?
write_attribute(:start_date, date)
end
这会将我的MM / DD / YYYY设置为YYYY / MM / DD,然后将其保存到数据库中。
答案 1 :(得分:1)
我解决这个问题的方法是引入我的日期字段的字符串版本(在你的情况下为start_date_str),并在我的视图中使用它。我还为新的实例变量设置了一个getter和setter,它包含转换和实际日期字段值的设置。
不要忘记在Rails 3中的attr_accessible或Rails 4的白名单中添加start_date_str。
def start_date_str
@start_date_str || start_date.to_s
end
def start_date_str=(value)
@start_date_str = value
self.start_date = Date.strptime(value, '%Y-%m-%d')
end
答案 2 :(得分:0)
你只是回复了一些东西而没有真正设置任何东西。
def start_date=(val)
@start_date = Date.strptime(val, '%Y-%m-%d')
end