Rails: ActiveSupport::Format serialisasi TimeWithZone di 5.xx tidak kompatibel dengan 4.xx

Dibuat pada 27 Agu 2016  ·  3Komentar  ·  Sumber: rails/rails

Perilaku yang diharapkan

Kami memiliki beberapa aplikasi menggunakan rails 5.0.0.1 dan rails 4.2.7.1 dan berbagi database yang sama.

5.0.0.1 serialisasi zona waktu berbeda dari 4.2.7.1 diperkenalkan oleh komit ini.

Aplikasi kami yang menggunakan rails 4.2.x.x tidak dapat melakukan deserialize YAML baru yang ditulis oleh aplikasi rails 5.0.0.1 .

Akan lebih baik jika 4.2.x.x dapat melakukan deserialize format baru.

Backtrace

NoMethodError: undefined method `period_for_utc' for nil:NilClass
- 40 non-project frames
1
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.7.1/lib/active_support/time_with_zone.rb" line 67 in period
2
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.7.1/lib/active_support/time_with_zone.rb" line 53 in time
3
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.7.1/lib/active_support/time_with_zone.rb" line 365 in respond_to_missing?
4
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.7.1/lib/active_support/time_with_zone.rb" line 357 in respond_to?
5
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.7.1/lib/active_support/time_with_zone.rb" line 357 in respond_to?
6
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 364 in init_with
7
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 357 in revive
8
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 207 in visit_Psych_Nodes_Mapping
9
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 15 in visit
10
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 5 in accept
11
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 31 in accept
12
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 314 in block in register_empty
13
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 314 in each
14
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 314 in register_empty
15
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 140 in visit_Psych_Nodes_Sequence
16
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 15 in visit
17
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 5 in accept
18
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 31 in accept
19
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 321 in block in revive_hash
20
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 319 in each
21
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 319 in each_slice
22
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 319 in revive_hash
23
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 161 in visit_Psych_Nodes_Mapping
24
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 15 in visit
25
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 5 in accept
26
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 31 in accept
27
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 295 in visit_Psych_Nodes_Document
28
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 15 in visit
29
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/visitor.rb" line 5 in accept
30
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/visitors/to_ruby.rb" line 31 in accept
31
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych/nodes/node.rb" line 37 in to_ruby
32
File "/var/app/20160825T221638Z/vendor/ruby-2.2.4/lib/ruby/2.2.0/psych.rb" line 246 in load
33
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/coders/yaml_column.rb" line 26 in load
34
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/type/serialized.rb" line 19 in type_cast_from_database
35
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute.rb" line 104 in type_cast
36
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute.rb" line 42 in original_value
37
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute.rb" line 37 in value
38
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute_set.rb" line 31 in fetch_value
39
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute_methods/read.rb" line 93 in _read_attribute
40
File "/var/app/20160825T221638Z/vendor/bundle/ruby/2.2.0/gems/activerecord-4.2.7.1/lib/active_record/attribute_methods.rb" line 50 in __temp__16574696475646f5368616e6765637

Sistem konfigurasi

Versi rel : 4.2.7.1

Versi Ruby : 2.2.4

activesupport needs feedback

Komentar yang paling membantu

@kwent seperti yang Anda katakan, masalah Anda adalah bahwa Anda memiliki instance AS::TWZ yang diserialkan oleh aplikasi Rails 5.0 yang dibaca oleh aplikasi Rails 4.2 sebagai sebaliknya tidak masalah karena mereka dibaca sebagai standar Ruby UTC Contoh waktu.

Saya pikir Anda harus menambal aplikasi Rails 5.0 atau aplikasi Rails 4.2 Anda agar nilai-nilai tersebut kompatibel satu sama lain. Memperbaikinya agar Rails 4.2 dapat membacanya mungkin tampak mungkin tetapi Anda masih akan mengalami masalah karena instance tersebut akan diserialisasikan dalam format 4.2 karena kami tidak dapat mengubah cara penulisannya dalam rilis patch.

Masukkan kode berikut ke dalam penginisialisasi di aplikasi Rails 4.2 Anda dan semuanya akan berfungsi:

# https://github.com/rails/rails/issues/26296
ActiveSupport::TimeZone.class_eval do
  def init_with(coder) #:nodoc:
    initialize(coder['name'])
  end

  def encode_with(coder) #:nodoc:
    coder.tag ="!ruby/object:#{self.class}"
    coder.map = { 'name' => tzinfo.name }
  end
end

ActiveSupport::TimeWithZone.class_eval do
  def init_with(coder) #:nodoc:
    initialize(coder['utc'], coder['zone'], coder['time'])
  end

  def encode_with(coder) #:nodoc:
    coder.tag = '!ruby/object:ActiveSupport::TimeWithZone'
    coder.map = { 'utc' => utc, 'zone' => time_zone, 'time' => time }
  end
end

Biasanya dalam situasi seperti ini kami akan melakukan migrasi maju, misalnya ketika kami memperkenalkan serialisasi sesi JSON di 4.1 kami menawarkan hibrida yang akan membaca serialisasi yang ada dan mengonversinya tetapi bukan migrasi mundur di mana sesi JSON yang dibuat di 4.1 akan bekerja dengan 4.0 aplikasi.

HTH dan maaf atas gangguan yang ditimbulkan.

Semua 3 komentar

R? @pixeltrix

@kwent seperti yang Anda katakan, masalah Anda adalah bahwa Anda memiliki instance AS::TWZ yang diserialkan oleh aplikasi Rails 5.0 yang dibaca oleh aplikasi Rails 4.2 sebagai sebaliknya tidak masalah karena mereka dibaca sebagai standar Ruby UTC Contoh waktu.

Saya pikir Anda harus menambal aplikasi Rails 5.0 atau aplikasi Rails 4.2 Anda agar nilai-nilai tersebut kompatibel satu sama lain. Memperbaikinya agar Rails 4.2 dapat membacanya mungkin tampak mungkin tetapi Anda masih akan mengalami masalah karena instance tersebut akan diserialisasikan dalam format 4.2 karena kami tidak dapat mengubah cara penulisannya dalam rilis patch.

Masukkan kode berikut ke dalam penginisialisasi di aplikasi Rails 4.2 Anda dan semuanya akan berfungsi:

# https://github.com/rails/rails/issues/26296
ActiveSupport::TimeZone.class_eval do
  def init_with(coder) #:nodoc:
    initialize(coder['name'])
  end

  def encode_with(coder) #:nodoc:
    coder.tag ="!ruby/object:#{self.class}"
    coder.map = { 'name' => tzinfo.name }
  end
end

ActiveSupport::TimeWithZone.class_eval do
  def init_with(coder) #:nodoc:
    initialize(coder['utc'], coder['zone'], coder['time'])
  end

  def encode_with(coder) #:nodoc:
    coder.tag = '!ruby/object:ActiveSupport::TimeWithZone'
    coder.map = { 'utc' => utc, 'zone' => time_zone, 'time' => time }
  end
end

Biasanya dalam situasi seperti ini kami akan melakukan migrasi maju, misalnya ketika kami memperkenalkan serialisasi sesi JSON di 4.1 kami menawarkan hibrida yang akan membaca serialisasi yang ada dan mengonversinya tetapi bukan migrasi mundur di mana sesi JSON yang dibuat di 4.1 akan bekerja dengan 4.0 aplikasi.

HTH dan maaf atas gangguan yang ditimbulkan.

Yah aku melakukan yang sebaliknya. Saya menambal aplikasi 5.0.0.1 Rails saya untuk menulis objek ini seperti yang akan dilakukan Rails 4.2 dengan menyalin dan menambahkan file ini ke penginisialisasi saya. Bekerja juga!

https://github.com/rails/rails/blob/4-2-stable/activesupport/lib/active_support/time_with_zone.rb

Terima kasih untuk umpan baliknya.

Salam,

Apakah halaman ini membantu?
0 / 5 - 0 peringkat