Копирование или дублирование копий Rails

У меня есть вложенная форма, и как только я сохраню, я хочу, чтобы иметь возможность щелкнуть ссылку на странице показа, чтобы скопировать или клонировать эту форму и открыть новую. Оттуда я должен иметь возможность редактировать (как новый идентификатор) и сохранять как новую запись. Я видел несколько примеров, таких как deep_cloneable gem, но я понятия не имею, как его реализовать. Я думаю, что это должно быть просто, но я просто не понимаю, куда положить вещи в контроллер и в шоу.

Ответ 1

Если вы хотите скопировать объект 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

Ответ 2

Я нашел эти ответы немного трудными для подражания. Один ответ показывает это:

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

который не будет работать, поскольку он также передаст идентификатор и значения временной метки. Я использовал .dup, чтобы исправить это, и я покажу это в своем ответе.

Вот как мне удалось создать новый элемент из существующего элемента.

Модель предназначена для Продукта, контроллера Products_Controller.rb. Мы добавим новое действие в контроллер COPY, и мы собираемся связать его с представлением SHOW на существующем продукте и отобразить заполненный НОВЫЙ вид, готовый к редактированию и сохранению.

Сначала мы создаем маршрут для действия копирования в route.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_to "copy", copy_product_path(params[:id]) %>

Это сработало для меня. Я надеюсь, что это сработает для вас и что ответ достаточно прост, чтобы следовать.

Ответ 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

Ответ 4

Также стоит упомянуть метод 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