【问题标题】:Rails - Getting datetime_select into user timezone for model validationRails - 让 datetime_select 进入用户时区以进行模型验证
【发布时间】:2014-11-30 06:46:15
【问题描述】:

我试图得到这个答案,但没有运气,所以我会再试一次。

我已经实现了 railcast timezone 好东西,以允许用户设置他们的时区。有用。 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 日历/时间选择器,因为我似乎无法完成这项工作..但是任何关于替代方案或这方面的建议都值得赞赏..

【问题讨论】:

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


    【解决方案1】:

    确保你的模型中有这条线:

    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.

    【讨论】:

    • 是的,我复制了我的一个旧示例,但我都试过了,我的和完全复制他的代码。您是否对时区进行了任何其他设置?
    • 不,它的工作原理与我发布的链接中所写的一样。当您说它不起作用时,您是否尝试检查方法 start_date_cannot_be_in_the_past 中的 date_start 的值,或者方法 start_date_cannot_be_in_the_past 是否首先被调用?您是否也复制了线路:validate :start_date_cannot_be_in_the_past
    • 在我看来应该如何检查它?它显示在我的事件中我的调试信息的参数中。我无法像 params[:event][:date_start] 这样查看 :date_start。所以我尝试了类似params[:event]['date_start(1i)'] 的方法来查看第一部分,我得到了一个 undefined [] for nilclass。是的,验证部分在
    • @Clam : inside method: start_date_cannot_be_in_the_past write: puts '*'*100 然后puts self.inspect 并查看对象是否具有正确值的 date_time。
    • 它似乎在那里。只是在错误的时区。我在服务器控制台中看到了事件0 Nov 2014 00:20:00 +0000 它应该是-0800 时区
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多