ActiveResource. Создавать без ошибок, но не сохраняется - PullRequest
1 голос
/ 23 ноября 2011
require 'active_resource'

class MyRsrc < ActiveResource::Base
    self.site = "http://localhost:9292/api/0/category/sys_demo"
    self.element_name = "myname"
end


# from https://github.com/anibalcucco/basecamp-wrapper/issues/11
class Hash
  def collect!(&block)
    ret = []
    self.each {|key,val|
      if val.kind_of? Array
        val.collect!{|subval|
          block.call subval
        }
        ret = val
      end
    }
    return ret
  end
end


r = MyRsrc.create(node_uri: 'http://api.example.com/api/nodes/4')
 => #<MyRsrc:0x000000033a13f0 @attributes={"node"=>"http://api.example.com/api/nodes/4", "id"=>"42"}, @prefix_options={}, @persisted=false, @remote_errors=nil, @validation_context=nil, @errors=#<ActiveResource::Errors:0x0000000339a050 @base=#<MyRsrc:0x000000033a13f0 ...>, @messages={}>> 

r.errors.count
 => 0 

r.errors.full_messages
 => [] 

r.valid?
 => true 

r.new?
 => true 

r.persisted?
 => false 

r.save
 => true 

r.persisted?
 => false 

Почему мой объект не сохранился?

спасибо

1 Ответ

3 голосов
/ 23 ноября 2011

Какой ответ возвращает сервер?create имеет следующее определение:

def create
  connection.post(collection_path, encode, self.class.headers).tap do |response|
    self.id = id_from_response(response)
    load_attributes_from_response(response)
  end
end

и load_attributes_from_response определяется как:

def load_attributes_from_response(response)
  if (response_code_allows_body?(response.code) &&
      (response['Content-Length'].nil? || response['Content-Length'] != "0") &&
      !response.body.nil? && response.body.strip.size > 0)
    load(self.class.format.decode(response.body), true)
    @persisted = true
  end
end

Таким образом, для вашего ресурса не будет установлено persisted, если:

  1. код ответа указывает на ответ без тела
  2. длина содержимого ответа отсутствует или 0
  3. тело ответа пусто

Это похоже на вероятное место для начала.

...