在Rails 3中复制记录

dan*_*mcc 9 activerecord duplicate-data clone model ruby-on-rails-3

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

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

出现读取Rails API的克隆方法可用.

阅读其他问题和答案表明可以做到但除了以下代码之外没有示例代码:

new_record = old_record.dup
Run Code Online (Sandbox Code Playgroud)

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

  # 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

def clone
 @prescription = Prescription.find(params[:id])
 @prescription.dup
 @prescription.save
end
Run Code Online (Sandbox Code Playgroud)

如果上面的代码完全错误,我很抱歉,我正试图理解它!我已经看到有人做了我正在尝试用克隆实现的东西 - 但是在保存之前没有编辑.

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

ron*_*chn 7

如果您希望克隆操作允许用户在保存副本(创建AKA)之前查看副本,那么它几乎就像"新"操作,除了已经填入的字段.

所以你的克隆方法可以修改你的新方法:

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
Run Code Online (Sandbox Code Playgroud)

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


sea*_*boy 6

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

你的代码应该是:

def clone
 @prescription = Prescription.find(params[:id])
 @new_prescription = @prescription.dup
 @new_prescription.save
end
Run Code Online (Sandbox Code Playgroud)

要么

def clone
 @prescription = Prescription.find(params[:id]).dup
 @prescription.save
end
Run Code Online (Sandbox Code Playgroud)

当找不到:id时,这不会测试.