11
votes

Rails clone copier ou copier

J'ai une forme imbriquée et une fois que je sauvegarde, je souhaite pouvoir cliquer sur un lien de la page Afficher la page pour copier ou cloner ce formulaire et ouvrir un nouveau. De là, je devrais pouvoir faire des modifications (comme un nouvel identifiant) et enregistrer en tant que nouvel enregistrement. J'ai vu des exemples comme celui-ci gemme de profondeur , mais je n'ai aucune idée de la mise en œuvre. Je pense que cela devrait être simple, mais je ne comprends tout simplement pas où mettre les choses dans le contrôleur et dans la vue Afficher.


0 commentaires

4 Réponses :


21
votes

Si vous souhaitez copier un objet ActiveRecord, vous pouvez utiliser ses attributs pour créer une nouvelle personne comme

Vous pouvez avoir une action dans votre contrôleur qui peut être appelé sur le lien, P>

def  create_from_existing
 @existing_post = Post.find(params[:id])
 #create new object with attributes of existing record 
 @post = Post.new(@existing_post.attributes) 
 render "your_post_form"
end


5 commentaires

Merci, alors après cela se passe dans mon contrôleur, comment la balise Link_To devrait-elle regarder dans la vue?


Êtes-vous nouveau dans les rails? Sur la page de spectacle, vous devez rendre un lien indique lien_to "Copier sur un nouvel enregistrement", {: contrôleur => "Votre contrôleur",: action => 'create_from_existing',: id => parames [: id]} également, Définir l'itinéraire inroute.rb Fichier pour Cree_From_Existing Action. Si vous souhaitez afficher ce formulaire sur la page existante, vous pouvez utiliser Ajax à l'aide de lien_to_remote (link_to: distant => vrai, rails 3)


Comment cela gère-t-il HAS_MANY? Cela crée-t-il de nouveaux enregistrements pour les objets enfant ou utilise-t-il les mêmes enregistrements?


Cela va échouer si @existing_post a des attributs qui ne sont pas assignables de masse. Vous devez rejeter des attributs protégés ou uniques tels que ID .


Il y a un Réponse Lorsque le clonage implique la conservation des enregistrements associés



3
votes
class Foo < ActiveRecord::Base
  def self.clone_from(parent)
    parent = find(parent) unless parent.kind_of? Foo
    foo = self.new
    foo.attributes = parent.attributes
    # if you want to also clone a habtm:
    foo.some_association_ids = parent.some_association_ids
    # etc.
    foo
  end
end

class FoosController < ApplicationController
  def clone
    foo = Foo.clone_from(params[:id])
    respond_with(foo)
  end
end

0 commentaires

21
votes

J'ai trouvé ces réponses un peu difficile à suivre. Une réponse montre ceci: xxx pré>

qui ne fonctionnera pas car il passera également l'ID et les valeurs d'horodatage. J'ai utilisé .du pour résoudre ce problème et je montrais que dans ma réponse. P>

Voici comment j'ai réalisé de créer un nouvel élément d'un élément existant. P>

Le modèle est pour un produit, le contrôleur produits_controller.rb. Nous allons ajouter une nouvelle action au contrôleur appelé copier code> et nous allons y créer un lien à partir de la vue code> Afficher sur un produit existant et de rendre rempli. Nouveau code> Prêt à être édité et enregistré. p>

Nous créons d'abord un itinéraire pour l'action de copie dans routes.rb code> p>

# show.html.erb
<%= link_to "copy", copy_product_path(@product) %>


0 commentaires

2
votes

mérite également de mentionner est la méthode DUP code> sur un modèle. Il en fait une copie avec tous les attributs et relations sortantes, mais définit ID code> sur nil code>. Comme ceci (code d'emprunt de Naren Sisodiya):

def create_from_existing
  @existing_post = Post.find(params[:id])
  #create new object with attributes of existing record 
  @post = @existing_post.dup
  render "your_post_form"
end


0 commentaires