如何在将日期保存到Rails 4中的数据库之前转换日期?

时间:2014-09-23 18:56:12

标签: ruby-on-rails ruby-on-rails-4

我试图在我的一个模型上使用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所说,但仍然没有任何反应。

3 个答案:

答案 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