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. p>
4 Réponses :
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
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 code> a des attributs qui ne sont pas assignables de masse. Vous devez rejeter des attributs protégés ou uniques tels que
ID code>.
Il y a un Réponse Lorsque le clonage implique la conservation des enregistrements associés
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
J'ai trouvé ces réponses un peu difficile à suivre. Une réponse montre ceci: 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é Nous créons d'abord un itinéraire pour l'action de copie dans 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>
routes.rb code> p>
# show.html.erb
<%= link_to "copy", copy_product_path(@product) %>
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