我有一个包含datetime
属性的模型,使用bootstrap-datetimepicker(http://www.malot.fr/bootstrap-datetimepicker/demo.php)在表单中填充此属性。
问题在于每次我更改表单中的某些内容并调用update
控制器时,该属性被视为不同并由rails更新。
基本上,即使在表单中未更改属性,该属性也会在DB中更新。
我认为这是我提交日期格式的问题(这是一个文本字段)。我不确定文本的格式应该是什么。
以下是一些代码:
模型
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
控制器时对象似乎更新的原因是旧的和值的评估方式不同:
[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
即旧是在CEST中,而值被解释为UTC。
现在我要弄清楚如何告诉rails新值也在CEST中。
任何线索?
UPDATE2:
我认为bootstrap-datetimepicker
缺乏支持,所以切换到使用由jquery-ui datepicker和jquery timepicker处理的两个单独的输入字段。我发现我有同样的问题,并将问题跟踪到rails 3.2.14代码,其中框架中可能存在一个错误,我报告here。
我不确定我应该采用不同的方式实现这一点。
答案 0 :(得分:1)
使用此猴子补丁https://gist.github.com/kennyj/6651773
修复了rails框架上的问题修复程序应该出现在下一个3.2.14版本的rails中。