I’ve just upgraded a Phoenix app to 1.3 and Elixir 1.5.2. Now I get an exception on staging but not locally. I’ve traced it down (after getting some help from @michalmuskala on Slack) to when Poison encodes dates.
I use Poison 3.1, and this is the error I get:
** (Poison.EncodeError) unable to encode value: {0, 6}
(poison) lib/poison/encoder.ex:383: Poison.Encoder.Any.encode/2
(poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
(poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:227: anonymous fn/4 in Poison.Encoder.Map.encode/3
(poison) lib/poison/encoder.ex:228: Poison.Encoder.Map."-encode/3-lists^foldl/2-0-"/3
(poison) lib/poison/encoder.ex:228: Poison.Encoder.Map.encode/3
I only return Maps from my render functions (not using @derive in model/schema).
The Map that fails to encode looks like this:
%{id: 216, images: [%{aspect_ratio: 1.33333, id: 194, urls: %{original: "https://example.com/foo.jpg?v=63674938035", small: "https://example.com/foo.jpg?v=63674938035", thumb: "https://example.com/foo.jpg?v=63674938035"}}], inserted_at: ~N[2017-10-11 10:46:53.000000], tag_list: ["foo", "bar", "baz", "qux"], text: "Some text", thread: %{address: "Address 1", area: 100, district: nil, id: 127, interest_count: 4, internal_id: "23852", location: %{lat: 57.7456204, long: 11.9868868}, lot_size: nil, price: 2500000, property_type: %{id: 3, name: "FooBar"}, realtor: %{avatar_url: "https://example.com/avatar.jpg?v=63674969635", email: "foobar@example.com", first_name: "Foo", id: 78, last_name: "Bar", realtor: true}, rooms: #Decimal<4.0>, status: 2, title: "Some title", user_interest_level: 0, web_url: "https://example.com/threads/127"}, thread_id: 127, updated_at: ~N[2017-10-11 10:46:53.000000]}
And from what I can find it’s the NaiveDateTime that breaks.
Any ideas on how to fix this?