Rails克隆复制或复制

时间:2011-04-19 04:01:25

标签: ruby-on-rails copy duplicates clone

我有一个嵌套表单,一旦我保存,我希望能够单击显示页面上的链接来复制或克隆该表单并打开一个新表单。从那里我应该能够进行编辑(比如新的id)并保存为新记录。我看过像deep_cloneable gem这样的例子,但我不知道如何实现它。我认为这应该很简单,但我只是不明白把东西放在控制器和show视图中的位置。

4 个答案:

答案 0 :(得分:19)

如果要复制activeRecord对象,可以使用其属性创建新属性,如

您可以在控制器中执行操作,可以在链接上调用

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

答案 1 :(得分:19)

我发现这些答案有点难以理解。一个答案显示了这一点:

@post = Post.new(@existing_post.attributes)

这将无法正常工作,因为它也会传递id和timestamp值。我使用.dup来修复它,我在答案中表明了这一点。

以下是我从现有项目中创建新项目的方法。

该模型适用于Product,控制器Products_Controller.rb。我们将向控制器添加一个名为COPY的新操作,我们将从现有产品的SHOW视图链接到它,并渲染一个已填写的新视图,可以进行编辑和保存。

首先,我们在routes.rb

中为复制操作创建路径
resources :Products do
    member do
      get 'copy'
    end
  end

然后在Products_controller.rb

中进行复制操作
 def copy
        @source = Product.find(params[:id])
        @product = @source.dup
        render 'new'
      end

现在我们需要在SHOW视图中添加一个Link来调用我们的复制操作。

<%= link_to "copy", copy_product_path(params[:id]) %>

这对我有用。我希望它适合你,答案很简单,可以遵循。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

另外值得一提的是模型上的dup方法。它制作了包含所有属性和传出关系的副本,但将id设置为nil。像这样(借用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