Pergunta

Eu estou usando ActiveResource no Rails para gerenciar entidades em um banco de dados separado sobre REST.

Eu tenho tentado gerenciar explicitamente os IDs dos recursos remotos, como para o caso atual é mais simples de apenas re-utilizar ID do recurso local, em vez de manter um campo diferente.

Infelizmente eu não tenho sido capaz de começar este trabalho como o código para new? em ActiveResource::Base é

  def new?
    id.nil?
  end

e save é

 def save
   new? ? create : update
 end

Assim, desde que, por definição, é impossível definir um ID de um recurso e guardá-lo como um novo recurso.

create e update são métodos protegidos, então se eu hackeado o código ActiveResource :: Base, talvez, que iria fazê-lo funcionar, mas estou relutante em fazer isso.

Existe uma maneira correta de fazer isso? Ou é o que estou tentando fazer exatamente ruim, e eu não deveria fazê-lo?

Foi útil?

Solução

Você está trabalhando contra as intenções de ActiveResource. ActiveResource fornece uma interface para webservices REST, que, por convenção devolver o ID atribuído quando você a criar.

Dito isto, se você controlar o recurso que você está usando, e você modificou seu comportamento a ter um ID ao salvar um novo recorde, você pode modificar ActiveResource :: Base para se conformar. Não é realmente incomum para pessoas em Rails para fazer adições e mudanças para classes de base; você acabou de colocar seu patch no lib e incluí-lo em algum lugar no seu material de inicialização.

Eu não acho que é uma boa idéia, necessariamente, mas é possível. :)

Outras dicas

Em novos trilhos (testado 2.3.2) id pode ser definido, como a poupança lógica mudou um pouco (agora registros têm @newrecord campo booleano para eliminar essa id.nil?).

record = Model.new
record.id = 123
record.save!
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top