Копирование или дублирование Rails - PullRequest
11 голосов
/ 19 апреля 2011

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

Ответы [ 4 ]

19 голосов
/ 07 августа 2013

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

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

, который не будет работать, поскольку он также передаст значения id и метки времени.Я использовал .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]) %>

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

19 голосов
/ 19 апреля 2011

Если вы хотите скопировать объект 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
3 голосов
/ 19 апреля 2011
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
2 голосов
/ 21 января 2016

Также стоит упомянуть метод dup на модели.Он создает копию со всеми атрибутами и исходящими отношениями, но устанавливает id в nil.Вот так (заимствование кода у Нарена Сисодия):

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
...