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