我需要复制一条记录,除了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
答案 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
)两者到控制台以查看克隆是否成功。还可以在保存后打印克隆的项目,以查看是否更改了内容。