【问题标题】:Getting rails to accept European date format (dd/mm/yyyy)让 rails 接受欧洲日期格式 (dd/mm/yyyy)
【发布时间】:2010-02-05 04:11:27
【问题描述】:

我希望我的 rails 应用程序接受 dd/mm/yyyy 格式的日期字段的日期。

在我的模型中,我尝试将日期转换为美国标准,我认为 Rails 将调用它的 Date.parse 方法是预期的:

  before_validation :check_due_at_format

  def check_due_at_format
    self.due_at = Date.strptime(self.due_at,"%d/%m/%Y").to_time
  end

但是,这会返回:

TypeError in OrdersController#update
can't dup NilClass

如果知道有用的话,Items 表单字段嵌套在 Orders 中,并且 Orders 设置为:

  accepts_nested_attributes_for :items, :reject_if => lambda { |a| a[:quantity].blank? && a[:due_at].blank? }, :allow_destroy => :true

因此项目正在@order.save/@order.update_attributes 上进行验证和保存/更新

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby date parsing


    【解决方案1】:

    这可能只是due_at 值为零的情况。在您的情况下,它是一个空字符串,但由于accepts_nested_attributes_for 上的:reject_if 选项而被忽略,因此它保持为零。

    >> Date.strptime(nil, "%d/%m/%Y")
    TypeError: can't dup NilClass
    

    然后用一些条件来处理它。

    self.due_at = Date.strptime(self.due_at,"%d/%m/%Y").to_time unless self.due_at.nil?
    

    【讨论】:

      【解决方案2】:

      我在 Ruby 1.8.7 中遇到了完全相同的问题,我能解决的唯一方法是分两步进行自赋值!!

      xxx = Date.strptime(self.due_at,"%d/%m/%Y").to_time

      self.due_at = xxx

      我无法相信这应该是必要的。我唯一能想到的是,ruby 在完成使用右侧的 Due_at 源字符串之前,正在零碎地分配新目标日期类中的字段。

      Ruby 1.9.3 中似乎不存在该问题

      【讨论】:

        猜你喜欢
        • 2021-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多