Существует встроенный тип с именем Data
, цель которого довольно таинственная .Вы, кажется, наталкиваетесь на него:
$ ruby -e 'Data.new'
-e:1:in `new': allocator undefined for Data (TypeError)
from -e:1
Вопрос в том, как он туда попал?Последний кадр стека помещает нас здесь .Итак, похоже Data
вышло из звонка на find_or_create_resource_for
.Ветвь кода здесь выглядит вероятной:
$ irb
>> class C
>> end
=> nil
>> C.const_get('Data')
=> Data
Это заставляет меня подозревать, что у вас есть атрибут или подобное, плавающее вокруг с именем :data
или "data"
, даже если вы этого не делаетеупомянуть один выше.Вы?В частности, кажется, что у нас есть ответ JSON с дополнительным хешем, ключ которого - «data».
Вот скрипт, который может вызвать ошибку для специально созданного ввода, но не из отправленного вами ответа:
$ cat ./activeresource-oddity.rb
#!/usr/bin/env ruby
require 'rubygems'
gem 'activeresource', '3.0.10'
require 'active_resource'
class User < ActiveResource::Base
self.site = "http://localhost:3000/"
self.element_name = "users"
self.format = :json
end
USER = User.new :name => "Test", :email => "test.user@domain.com"
def simulate_load_attributes_from_response(response_body)
puts "Loading #{response_body}.."
USER.load User.format.decode(response_body)
end
OK = '{"email":"test@gmail.com","name":"test curl","admin":false,"uuid":"afb8c98b-562a-4603-bbe4-f8f0816cef0d","creation_limit":5}'
BORKED = '{"data":{"email":"test@gmail.com","name":"test curl","admin":false,"uuid":"afb8c98b-562a-4603-bbe4-f8f0816cef0d","creation_limit":5}}'
simulate_load_attributes_from_response OK
simulate_load_attributes_from_response BORKED
производит ..
$ ./activeresource-oddity.rb
Loading {"email":"test@gmail.com","name":"test curl","admin":false,"uuid":"afb8c98b-562a-4603-bbe4-f8f0816cef0d","creation_limit":5}..
Loading {"data":{"email":"test@gmail.com","name":"test curl","admin":false,"uuid":"afb8c98b-562a-4603-bbe4-f8f0816cef0d","creation_limit":5}}..
/opt/local/lib/ruby/gems/1.8/gems/activeresource-3.0.10/lib/active_resource/base.rb:1233:in `new': allocator undefined for Data (TypeError)
from /opt/local/lib/ruby/gems/1.8/gems/activeresource-3.0.10/lib/active_resource/base.rb:1233:in `load'
from /opt/local/lib/ruby/gems/1.8/gems/activeresource-3.0.10/lib/active_resource/base.rb:1219:in `each'
from /opt/local/lib/ruby/gems/1.8/gems/activeresource-3.0.10/lib/active_resource/base.rb:1219:in `load'
from ./activeresource-oddity.rb:17:in `simulate_load_attributes_from_response'
from ./activeresource-oddity.rb:24
На вашем месте я бы открыл /Library/Ruby/Gems/1.8/gems/activeresource-3.0.10/lib/active_resource/base.rb
, нашел бы load_attributes_from_response
в строке 1320 и временно изменил
load(self.class.format.decode(response.body))
на
load(self.class.format.decode(response.body).tap { |decoded| puts "Decoded: #{decoded.inspect}" })
.. и снова воспроизведите ошибку, чтобы увидеть, что на самом деле выходит из вашего json-декодера.