2014-09-23 85 views
1

我试图在我的模型之一与引导datepicker有一个日期字段。我想在用户选择日期后格式化为MM/DD/YYYY。问题是这个日期格式对我的数据库(YYYY/MM/DD)不正确,我需要在保存之前格式化它。如何在将日期保存到Rails 4中的数据库之前转换日期?

在我的模型我创建了一个setter方法

def start_date=(val) 
    Date.strptime(val, '%Y-%m-%d') 
end 

当我在我的形式,如2014年9月23日输入日期,我得到一个错误说无效的日期。

我在做什么错?

我PARAMS

{"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

你只是回来的东西,而不是实际设置任何东西。

def start_date=(val) 
    @start_date = Date.strptime(val, '%Y-%m-%d') 
end 
1

我解决了,这是通过介绍我的日期字段(在你的情况start_date_str)的字符串版本,并在我的视图中使用它的方式。我也有一个getter和setter用于新的实例变量,它封装了实际日期字段值的转换和设置。

不要忘记添加start_date_str在Rails 3中或在您的白名单,以attr_accessible Rails中4

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 
+0

感谢您的回复,但我认为我在下面的答案中找到了更好的方式用于我的用例。 – oobie11 2014-09-23 19:49:03

4

所以我想通了,要做到这一点的最佳方式(我想:P)。

我不得不添加一个write_attribute()给我的setter来保存。

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然后将其保存到数据库中。

+0

我喜欢你的解决方案,我最终可能会在我的代码中使用你的方法来消除额外的实例变量。 – furman87 2014-09-23 20:04:10

+0

甜,很高兴帮助:) – oobie11 2014-09-23 20:06:04

相关问题