【问题标题】:datetime attribute gets updated every time with datetime-picker每次使用 datetime-picker 都会更新 datetime 属性
【发布时间】:2013-09-16 18:04:30
【问题描述】:

我有一个包含datetime 属性的模型,该属性使用引导日期时间选择器 (http://www.malot.fr/bootstrap-datetimepicker/demo.php) 填充到表单中。

问题是每次我更改表单中的某些内容并调用update 控制器时,该属性都会被视为不同,并由rails 更新。 基本上属性在数据库中更新,即使它没有在表单中更改。

我想我提交日期的格式有问题(这是一个文本字段)。我不确定文本应该是什么格式。

这里有一些代码:

模型

class Order < ActiveRecord::Base
  attr_accessible :filled_date
end

日期时间的html表单部分:

<div class="input-append date form_datetime">
  <input class="datetime_picker optional input-medium" id="visible_datetime" name="visible_datetime" type="text" value="16 Sep '13 - 18:45" disabled=""/>
</div>
<input class="datetime_picker optional input-medium" id="product_orders_attributes_0_filled_date" name="product[orders_attributes][0][filled_date]" size="30" type="hidden" value="2013-09-16 18:45" disabled="">

初始化为:

$(".form_datetime").datetimepicker({
      weekStart: 1
      daysOfWeekDisabled: [5,6]
      format: "dd M 'yy - hh:ii"
      autoclose: true
      pickerPosition: "bottom-left"
      todayBtn: true
      todayHighlight: true
      linkField: linkField
      linkFormat: "yyyy-mm-dd hh:ii"
})

我认为这是 linkFormat 这里我需要调整以解决我的问题的部分。

单击后,表单将作为(嵌套表单)发送:

"orders_attributes"=>
  {"0"=>
    {"filled_date"=>"2013-09-16 17:49",
     "_destroy"=>"",
     "id"=>"7"}},

这会在日志中生成如下一行:

UPDATE "orders" SET "filled_date" = '2013-09-16 15:49:00.000000', "updated_at" = '2013-09-16 16:45:32.557340' WHERE "orders"."id" = 7

有什么想法吗?

谢谢,

更新:

进行更多调查后,我发现 Rails 内部工作,它们无论如何都会更新对象中的所有字段,然后在每个对象上调用方法 _field_changed? 以验证它是否已更改。

该方法在 rails 3.2.14 中如下所示:

From: /usr/local/rvm/gems/ruby-2.0.0-head/gems/activerecord-3.2.14/lib/active_record/attribute_methods/dirty.rb @ line 87 ActiveRecord::AttributeMethods::Dirty#_field_changed?:

    81: def _field_changed?(attr, old, value)
    82:   if column = column_for_attribute(attr)
    83:     if column.number? && (changes_from_nil_to_empty_string?(column, old, value) ||
    84:                           changes_from_zero_to_string?(old, value))
    85:       value = nil
    86:     else
 => 87:       value = column.type_cast(value)
    88:     end
    89:   end
    90: 
    91:   old != value
    92: end

每次我将 for 提交给 update 控制器时似乎都会更新对象的原因是 old 和 value 评估不同:

[2] pry(#<EntryOrder>)> old
=> Tue, 17 Sep 2013 01:49:00 CEST +02:00
[3] pry(#<EntryOrder>)> value
=> "2013-09-17 01:49:00"
[4] pry(#<EntryOrder>)> column.type_cast(value)
=> 2013-09-17 01:49:00 UTC

即 old 在 CEST 中,而 value 被解释为 UTC。

现在我要弄清楚如何告诉 rails 新值也在 CEST 中。

有什么线索吗?

更新2:

我发现bootstrap-datetimepicker 缺乏支持,因此转而使用由jquery-ui datepickerjquery timepicker 处理的两个单独的输入字段。我发现无论如何我都有同样的问题,并将问题追踪到 rails 3.2.14 代码,其中框架中可能存在错误,我报告了here

我不确定我应该以不同的方式来实现它。

【问题讨论】:

    标签: ruby-on-rails forms datetime


    【解决方案1】:

    这个问题已通过这个猴子补丁https://gist.github.com/kennyj/6651773在 Rails 框架上得到修复

    该修复应该出现在下一个 3.2.14 版本的 rails 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2018-09-16
      • 1970-01-01
      相关资源
      最近更新 更多