Ruby on rails 3 在Rails 3中复制记录

Ruby on rails 3 在Rails 3中复制记录,ruby-on-rails-3,activerecord,model,clone,duplicate-data,Ruby On Rails 3,Activerecord,Model,Clone,Duplicate Data,我的Rails 3应用程序中有一个处方模型。我正在尝试找出允许复制记录的最佳方法,但允许用户在保存副本之前“查看”副本 我已经阅读了许多关于SO的问题/答案(例如一个),这些问题/答案解释了如何复制/克隆记录,然后保存它,但没有一个解释了如何在保存前显示表单 如果方法可用,则读取Rails API 阅读和回答表明这是可以做到的,但除了以下代码外,没有其他示例代码: new_record = old_record.dup 我当前使用的控制器代码如下(模型没有任何关系): 我将从以下视图链接到此克

我的Rails 3应用程序中有一个处方模型。我正在尝试找出允许复制记录的最佳方法,但允许用户在保存副本之前“查看”副本

我已经阅读了许多关于SO的问题/答案(例如一个),这些问题/答案解释了如何复制/克隆记录,然后保存它,但没有一个解释了如何在保存前显示表单

如果方法可用,则读取Rails API

阅读和回答表明这是可以做到的,但除了以下代码外,没有其他示例代码:

new_record = old_record.dup
我当前使用的控制器代码如下(模型没有任何关系):

我将从以下视图链接到此克隆操作:

<%= link_to "Create another like this?", clone_prescription_url(@prescription), :method => :put %>
抱歉,如果上面的代码完全错误,我正试图让我的头周围!我已经看到了我正试图通过克隆实现的目标,但在保存前编辑并没有做到这一点


保存记录后,正在复制的用户将没有编辑记录的权限。这纯粹是为了初始数据输入。

要做到这一点,您必须创建一个新的处方类实例。“dup”可以工作,但您假定它会覆盖现有记录。只有以砰砰(!)结尾的方法才会这样做

您的代码应该是:

def clone
 @prescription = Prescription.find(params[:id])
 @new_prescription = @prescription.dup
 @new_prescription.save
end


在找不到:id的情况下,这不是测试

如果您希望克隆操作允许用户在保存(即创建)副本之前查看副本,那么它几乎与“新建”操作类似,只是已经填充了字段

因此,克隆方法可能是对新方法的修改:

def new
  @prescription = Prescription.new()
end
def clone
  @prescription = Prescription.find(params[:id]) # find original object
  @prescription = Prescription.new(@prescription.attributes) # initialize duplicate (not saved)
  render :new # render same view as "new", but with @prescription attributes already filled in
end

在视图中,他们可以创建对象。

我正在寻找克隆现有记录的逻辑。我不得不稍微修改ronalchn发布的逻辑,因为当它试图执行clone的第二条语句时,我得到了一个批量分配错误,因为它试图复制id,created_at,updated_at,这些id不包括在我的attr_可访问列表中。这就是我如何使用我的模型修改逻辑以使其在我的应用程序中工作的方式:

@old_event = Event.find(params[:id]) # find original object
@event = Event.new
@event.field_1 = @old_event.field_1 (statement for each field in attar_accessible)
render :new # render same view as "new", but with @prescription attributes already filled in

我认为这是正确的答案,因为Rails在模型上使用
dup
时将id设置为nil,将其视为新的。看见
def clone
 @prescription = Prescription.find(params[:id]).dup
 @prescription.save
end
def new
  @prescription = Prescription.new()
end
def clone
  @prescription = Prescription.find(params[:id]) # find original object
  @prescription = Prescription.new(@prescription.attributes) # initialize duplicate (not saved)
  render :new # render same view as "new", but with @prescription attributes already filled in
end
@old_event = Event.find(params[:id]) # find original object
@event = Event.new
@event.field_1 = @old_event.field_1 (statement for each field in attar_accessible)
render :new # render same view as "new", but with @prescription attributes already filled in