6
votes

Clone (a.k.a. duplicate) un enregistrement

J'ai besoin de dupliquer un enregistrement, avec les mêmes attributs de l'original à l'exception de l'ID de Cource. Je fais:

dans la vue: xxx

et dans le contrôleur: xxx

mais rien ne se passe! Dans la console, j'ai compris que le clone génère la copie sans id.

aucune idée?

<> BTW: je cours des rails 2.3.5 et Ruby 1.8


2 commentaires

J'ai essayé de faire la même chose et ça marche pour moi. Le cloner doit générer une copie sans identifiant, car ID est défini pour enregistrer sur Enregistrer. J'ajouterais un logger.debug et enregistrez les journaux ce qui se passe dans votre action clone. Peut-être que quelque chose avec des itinéraires est faux?


AVERTISSEMENT dans Rails 3, n'appelez pas clone , appelez DUP . Stackoverflow.com/Questtions/60033/...


3 Réponses :


2
votes

Dans le script / console, cela fonctionne pour moi

>> i = Item.find(:first)
=> #<Item id: 1, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">
>> i2 = i.clone
=> #<Item id: nil, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">
>> i2.save
=> true
>> i2
=> #<Item id: 2, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">


0 commentaires

3
votes

Assurez-vous que le comportement cloné par défaut fonctionne pour vous. L'enregistrement cloné peut réellement être invalide en fonction de vos règles de validation.

Essayez d'utiliser @ item.save! au lieu de @ item.save et vérifiez si une exception est soulevé. Vous pouvez également essayer le code directement dans une instance de console. xxx

c'est vrai. #clone crée réellement un clone mais ne sauvegarde pas l'enregistrement. C'est pourquoi vous devez appeler une méthode de sauvegarde dans votre action, ce que vous faites réellement avec xxx


1 commentaires

Avec item.save! J'ai compris qu'une validation apparut. Merci!



7
votes

Évitez d'utiliser la méthode du clone. Ce n'est plus supporté. La méthode du clone déléguait désormais à l'utilisation du noyau # clone qui copiera l'ID de l'objet.

# rails < 3.1
new_record = old_record.clone

# rails >= 3.1
new_record = old_record.dup


0 commentaires