Rails克隆复制或复制

Fat*_*yan 11 clone copy ruby-on-rails duplicates

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

Nar*_*iya 20

如果要复制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
Run Code Online (Sandbox Code Playgroud)

  • 如果`@ existing_post`具有任何不可批量分配的属性,则会失败.您必须拒绝像`id`这样的受保护或唯一属性. (4认同)
  • 这个句柄如何处理has_many?它是为子对象创建新记录还是使用相同的记录? (2认同)

Pat*_*ick 19

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

@post = Post.new(@existing_post.attributes)
Run Code Online (Sandbox Code Playgroud)

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

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

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

首先,我们在routes.rb中为复制操作创建一个路由

resources :Products do
    member do
      get 'copy'
    end
  end
Run Code Online (Sandbox Code Playgroud)

然后在Products_controller.rb中进行复制操作

 def copy
        @source = Product.find(params[:id])
        @product = @source.dup
        render 'new'
      end
Run Code Online (Sandbox Code Playgroud)

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

<%= link_to "copy", copy_product_path(params[:id]) %>
Run Code Online (Sandbox Code Playgroud)

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