在Rails 3中复制记录

时间:2012-08-16 18:08:52

标签: ruby-on-rails-3 activerecord model clone duplicate-data

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

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

显示Rails API,clone方法可用。

阅读other questions和答案表明可以做到但除了以下没有示例代码:

new_record = old_record.dup

我目前使用的控制器代码如下(模型没有任何关系):

  # POST /prescriptions
  # POST /prescriptions.json
  def create
    @prescription = Prescription.new(params[:prescription])
    @prescription.localip = request.env['REMOTE_ADDR']
    @prescription.employee = @prescription.employee.upcase

    respond_to do |format|
      if @prescription.save
        format.html { redirect_to @prescription, notice: 'Prescription was successfully created.' }
        format.json { render json: @prescription, status: :created, location: @prescription }
      else
        format.html { render action: "new" }
        format.json { render json: @prescription.errors, status: :unprocessable_entity }
      end
    end
  end

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

<%= link_to "Create another like this?", clone_prescription_url(@prescription), :method => :put %>

就像向我的控制器添加动作一样简单吗?

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

如果上述代码完全错误,我很抱歉,我正试图解决它!我已经看到someone正是我正在尝试通过克隆实现的 - 而不是在保存之前进行编辑。

复制的用户在保存后无权编辑记录。它纯粹用于初始数据输入。

3 个答案:

答案 0 :(得分:7)

如果您希望克隆操作允许用户在保存副本(创建AKA)之前查看副本,那么它几乎就像&#34; new&#34;行动,除了已填写的字段。

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

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

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

答案 1 :(得分:5)

要做到这一点,您将不得不创建Prescription类的新实例。 “dup”有效,但您认为它会覆盖现有记录。只有以爆炸(!)结尾的方法才会这样做。

您的代码应为:

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

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

这不是在未找到:id的情况下进行测试。

答案 2 :(得分:0)

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

@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