克隆(又名重复)一个记录

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

在视图中:

 "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的副本。

有任何想法吗 ?

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

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

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

 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 

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

 # rails < 3.1 new_record = old_record.clone # rails >= 3.1 new_record = old_record.dup 

在脚本/控制台中,这对我有用

 >> i = Item.find(:first) => # >> i2 = i.clone => # >> i2.save => true >> i2 => # 

克隆确实不会增加id字段(逻辑,因为这是一个数据库操作)。 保存项目后,ID现在已更新,我的数据库包含克隆。

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