Клонировать (дублировать) запись - PullRequest
5 голосов
/ 15 января 2010

Мне нужно продублировать запись с теми же атрибутами, что и у оригинала, кроме идентификатора курса. Я делаю:

В представлении:

<%= link_to "Duplicate", :action => "clone", :id => Some_Existing_ID %>

А в контроллере:

def clone
  @item = Item.find(params[:id]).clone

  if @item.save
    flash[:notice] = 'Item was successfully cloned.'
  else
    flash[:notice] = 'ERROR: Item can\'t be cloned.'
  end

  redirect_to(items_path)
end      

Но ничего не происходит! В консоли я выяснил, что клон генерирует копию без идентификатора.

Есть идеи?

*> Кстати: я использую Rails 2.3.5 и Ruby 1.8

Ответы [ 3 ]

4 голосов
/ 12 июня 2014

Избегайте использования метода клонирования. Это больше не поддерживается. Метод clone теперь делегирует использование Kernel # clone, который будет копировать идентификатор объекта.

# rails < 3.1
new_record = old_record.clone

# rails >= 3.1
new_record = old_record.dup
3 голосов
/ 15 января 2010

Убедитесь, что клонированное поведение по умолчанию работает для вас. клонированная запись может действительно быть недействительной в соответствии с вашими правилами проверки.

Попробуйте использовать @item.save! вместо @item.save и проверьте, возникает ли исключение. Вы также можете попробовать код непосредственно в экземпляре консоли.

In Console I figured out that clone generates the copy without ID.

Это правда. #clone на самом деле создает клон, но не сохраняет запись. Вот почему вам нужно вызывать метод save в вашем действии, что вы фактически делаете с

if @item.save # <-- here you save the record
  flash[:notice] = 'Item was successfully cloned.'
else
  flash[:notice] = 'ERROR: Item can\'t be cloned.'
end
2 голосов
/ 15 января 2010

В скрипте / консоли это работает для меня

>> i = Item.find(:first)
=> #<Item id: 1, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">
>> i2 = i.clone
=> #<Item id: nil, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">
>> i2.save
=> true
>> i2
=> #<Item id: 2, name: "Item 1", description: "This is item 1!", created_at: "2010-01-03 21:51:49", updated_at: "2010-01-05 18:25:42">

Клонирование действительно не увеличивает поле id (логично, так как это действие базы данных). После сохранения элемента идентификатор теперь обновляется, и моя база данных содержит клон.

Так что должно работать ... Вы также можете попробовать это в своей консоли, чтобы посмотреть, работает ли оно также или оно не работает, как в вашем примере. Вы также можете разбить первую строку, поэтому найдите оригинал и клонируйте его в новую переменную и выведите (logger.debug @item.inspect) на консоль, чтобы увидеть, успешно ли клонирование. Также напечатайте клонированный объект после сохранения, чтобы увидеть, изменились ли вещи или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...