2010-02-04 13 views
0

J'appelle une application de rails d'un autre utilisant ActiveResource. Je dois fournir l'identifiant du nouvel objet à la première application (oui, contrôleur créer dans cette application sait comment gérer la réception d'un identifiant), donc je fais quelque chose comme ceci:ActiveResource peut-il POST créer au lieu de PUTTing quand un ID est spécifié?

a = ActiveResourceModel.new(:id => 1231231, :name => "test") 
a.save 

Cependant, au lieu de faire POST pour créer une nouvelle ressource PUT, provoquant l'application réceptrice à essayer de mettre à jour la ressource avec l'ID 1231231, qui bien sûr n'existe pas (je veux le créer!), Donc je finis par recevoir une erreur 404 à cause de ce.

En faisant quelques tests le problème semble être dans ActiveResourceModel.new? qui renvoie false, alors que ActiveResourceModel.exists? renvoie false aussi (Great, deux méthodes qui sont supposées être opposées retournent la même chose!).

Répondre

2

Vérification de la RESSOURCE À L'INTENTION source and documentation, la méthode vérifie new? pour la présence de l'identifiant et les exists? vérifie la ressource distante, ce qui rend à la fois le retour du même.

Pourquoi exactement vous devez passer l'identifiant pour créer un nouvel objet? Ça n'a pas de sens. Quoi qu'il en soit, vous pouvez essayer d'appeler la méthode create au lieu de save.

+0

J'ai oublié d'ajouter, créer est le même que nouveau + enregistrer. La chose id ... Les entités que je vais créer sont les mêmes dans les deux applications et doivent être synchronisées. Au lieu d'avoir un mappage entre les identifiants de chaque application, nous avons décidé qu'il serait plus facile d'utiliser les uuids comme identifiants et de les transmettre. – diegogs

+0

create essaie de publier la ressource directement. http://github.com/rails/rails/blob/master/activeresource/lib/active_resource/base.rb#L1327 Vous devriez éviter la réplication comme celle-ci. une troisième application pour centrer les données communes peut être moins problématique. – Lucas

1

J'ai le problème inverse. J'ATTENDS un PUT quand j'appelle AR.create avec un id (puisqu'il implique que l'enregistrement existe déjà). Cependant, avec Rails 3.1 et plus, il semble que le même code dans Rails 3.0, appelé PUT, appelle maintenant POST. Quelqu'un peut-il confirmer ce changement? (Depuis que j'ai le contrôle du serveur de réception, j'ai simplement ajusté le code POST pour avoir le même comportement que mon ancien code PUT).

+0

Eh bien, en cas de doute, vérifiez le code source. Dans 3.0, créer des chèques nouveaux? qui a l'air de voir si id.nil? Dans 3.1 et ci-dessus, il vérifie également nouveau ?, mais maintenant, nouveau? vérifie si l'objet a été conservé (ce qui est différent de vérifier si l'identifiant est défini). Ainsi, à l'interrogateur original, vous obtiendrez le comportement que vous recherchez (quoique assez tard) ... –