Rails - 将datetime_select转换为用户时区以进行模型验证

时间:2014-11-30 06:46:15

标签: ruby-on-rails ruby validation date datetime

我试图在没有运气的情况下得到答案,所以我会再试一次。

我已经实施了铁路广播时区的好东西,允许用户设置他们的时区。有用。 Time.zone.now给出了正确的时区。它就在这里 http://stevenyue.com/2013/03/23/date-time-datetime-in-ruby-and-rails/

我有活动并且一直试图让我的表单中的datetime_select给我一个也在用户时区的时间。

我的目标是能够将其与当前时间(Time.zone.now)进行比较,以验证开始时间不在当前时间之前。并最终结束时间>开始时间等。

我已经厌倦了几种方式,其中包括没有运气......

这一个 - 他后来回答了他自己的问题(这正是我的问题)

Rails datetime_select posting my current time in UTC

def start_date_cannot_be_in_the_past

   if date_start.in_time_zone(Time.zone) < Time.zone.now
     errors.add(:date_start, "has already passed")
   end

end

上述情况似乎无效,因为您无法像这样提取date_start。它被分成不同的组件,所以我试着做这样的事情

  def start_date_cannot_be_in_the_past

    date = DateTime.new(params[event][date_start(1i)].to_i, params[event][date_start(2i)].to_i, params[event][date_start(3i)].to_i, params[event][date_start(4i)].to_i, params[event][date_start(5i)].to_i)
    if date.in_time_zone < Time.zone.now
      errors.add(:date_start, "has already passed")
    end
  end

在我的模型中,我无法访问参数,因此我不知道如何让它工作......

如果可能的话,我想转移到jquery日历/时间选择器,因为我似乎无法完成这项工作..但是对于替代品或对此的任何建议都表示赞赏..

1 个答案:

答案 0 :(得分:0)

确保您的模型中有此行:

validate :start_date_cannot_be_in_the_past

然后这个方法可以是:

private
def start_date_cannot_be_in_the_past
  errors.add(:date_start, "has already passed") if self.date_start < Time.zone.now
end

See this for more information