Question

J'utilise ActiveResource dans Rails pour gérer des entités dans une base de données distincte via REST.

J'ai essayé de gérer explicitement les identifiants des ressources distantes, car dans le cas présent, il est plus simple de simplement réutiliser l'identifiant de la ressource locale, plutôt que de conserver un champ différent.

Malheureusement, cela n'a pas fonctionné comme code pour new? dans ActiveResource :: Base est

.
  def new?
    id.nil?
  end

et save est

 def save
   new? ? create : update
 end

Donc, par définition, il est impossible de définir un identifiant de ressource et de l'enregistrer en tant que nouvelle ressource.

create et update sont des méthodes protégées. Par conséquent, si je piratais le code ActiveResource :: Base, cela fonctionnerait peut-être, mais je suis réticent à le faire.

Existe-t-il une manière correcte de procéder? Ou est-ce que ce que j'essaie de faire est mauvais et que je ne devrais pas le faire?

Était-ce utile?

La solution

Vous travaillez contre les intentions d’ActiveResource. ActiveResource fournit une interface aux services Web REST qui, par convention, renvoient l’ID attribué lors de la création.

Cela dit, si vous contrôlez la ressource que vous utilisez et que vous modifiez son comportement pour prendre un ID lors de l'enregistrement d'un nouvel enregistrement, vous pouvez modifier ActiveResource :: Base pour qu'il soit conforme. Il n’est pas rare que les employés de Rails apportent des modifications et des ajouts aux classes de base; vous venez de mettre votre correctif dans lib et l'inclure quelque part dans votre truc de démarrage.

Je ne pense pas que ce soit une bonne idée, nécessairement, mais c'est possible. :)

Autres conseils

Dans les nouveaux rails (testé 2.3.2), id peut être défini, car la logique de sauvegarde a légèrement changé (les enregistrements ont désormais un champ booléen @newrecord pour éliminer cet id.nil?).

record = Model.new
record.id = 123
record.save!
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top