克隆(a.k.a。复制)一个记录

时间:2010-01-15 08:19:51

标签: ruby-on-rails

我需要复制一条记录,除了cource的ID之外,还有原始的相同属性。我这样做:

在视图中:

<%= 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      

但没有任何反应!在控制台中我发现克隆生成没有ID的副本。

有什么想法吗?

* GT; BTW:我正在运行Rails 2.3.5和Ruby 1.8

3 个答案:

答案 0 :(得分:4)

避免使用克隆方法。它不再受支持。 clone方法现在委托使用Kernel#clone,它将复制对象的id。

# rails < 3.1
new_record = old_record.clone

# rails >= 3.1
new_record = old_record.dup

答案 1 :(得分:3)

确保默认克隆行为适合您。根据您的验证规则,克隆的记录实际上可能无效。

尝试使用@item.save!而不是@item.save,并检查是否引发了异常。 您也可以直接在控制台实例中尝试代码。

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

这是真的。 #clone实际上创建了一个克隆但不保存记录。 这就是你需要在你的行动中调用一个保存方法的原因,这就是你实际使用

做的事情
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 :(得分:2)

在脚本/控制台中,这适用于我

>> 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字段(逻辑,因为这是一个数据库操作)。保存项目后,ID现在更新,我的数据库包含克隆。

所以它应该工作......你也可以在你的控制台中尝试这个,看看它是否运作良好,或者它是否像你的例子一样失败。您也可以拆分第一行,因此找到原始文件并将其克隆到一个新变量中并打印(logger.debug @item.inspect)两者到控制台以查看克隆是否成功。还可以在保存后打印克隆的项目,以查看是否更改了内容。