gpt4 book ai didi

ruby-on-rails - Rails ActiveRecord 回调

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:37 25 4
gpt4 key购买 nike

我遇到了日期格式问题。我有一个时间选择器,它的日期格式很古怪(好吧,实际上,这是一种很好的格式,但对计算机来说不是)。我正在尝试让 Chronic 解析日期以便正确保存它。

起初,我在 Controller 的创建操作中这样做:

params[:event][:start] = Chronic.parse(params[:event][:start])

但是如果验证失败,它会将解析后的值发送回 View ,然后我的 datetimepicker 就全搞砸了。

所以,我想……回调?在我的模型中,我添加了:

private
def date_change
self.start = Chronic.parse(self.start)
end

我尝试了 before_savebefore_validationafter_validation...但似乎没有任何方法可以正确设置日期格式。

就目前而言,我不断收到 ArgumentError in EventsController#create - Argument out of range。我认为这是因为数据库需要格式正确的日期时间对象。

关于如何实现我的目标,即不更改 params,但仍然能够保存格式正确的对象,有什么想法吗?

最佳答案

我猜测问题出在 ActiveRecord 提供的 start= 增变器方法上。如果你在你的 Controller 中做这样的事情:

@event.update_attributes(params[:events])
@event = Event.create(params[:event])
#...

然后 createupdate_attributes 应该在内部调用 start=。这应该允许您将 Chronic 内容放入您自己的 start=:

def start=(t)
super(Chronic.parse(t))
end

您可能需要为非字符串 t 调整它,例如,我不确定 Chronic.parse(Time.now) 会做什么.如果您不想,也可以调用 write_attribute(:start, Chronic.parse(t))self[:start] = Chronic.parse(t)踢到 super

请注意,before_validation 和类似的处理程序将被调用得太晚,无法绕过 ActiveRecord 正在执行的任何默认字符串到时间戳转换,但应该在正确的时间发生修改器覆盖。

或者,你可以用这样的方式解析 Controller 中的时间:

event = params[:events].dup
events[:start] = Chronic.parse(events[:start])
@event = Event.create(event)

关于ruby-on-rails - Rails ActiveRecord 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21344484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com