0

属性を含むモデルがありdatetimeます。この属性は、bootstrap-datetimepicker ( http://www.malot.fr/bootstrap-datetimepicker/demo.php ) を使用してフォームに入力されます。

問題は、フォームで何かを変更してコントローラーを呼び出すたびにupdate、属性が異なると見なされ、レールによって更新されることです。基本的に、フォームで変更されていない場合でも、属性は DB で更新されます。

日付を送信する形式 (テキスト フィールド) に問題があると思います。テキストの形式がどうあるべきかわかりません。

ここにいくつかのコードがあります:

モデル

class Order < ActiveRecord::Base
  attr_accessible :filled_date
end

datetime の 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

何か案は?

ありがとう、

アップデート:

さらに調査したところ、オブジェクトのすべてのフィールドをとにかく更新し、_field_changed?変更されたかどうかを検証するためにメソッドが呼び出されるという Rails の内部処理が行われていることがわかりました。

メソッドは 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 として解釈されます。

今度は、新しい値が CEST にもあることをレールに伝える方法を見つけなければなりません。

どんな手掛かり?

更新 2:

サポートが不足していると判断したため、 jquery-ui datepickerjquery timepickerbootstrap-datetimepickerによって処理される 2 つの個別の入力フィールドを使用するように切り替えました。とにかく同じ問題があることがわかり、フレームワークにおそらくバグがあるレール 3.2.14 コードまで問題を追跡し、ここで報告しました。

これを実装する別の方法があるかどうかはわかりません。

4

1 に答える 1