10

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

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

读取 Rails API 似乎可以使用克隆方法。

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

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

抱歉,如果上面的代码完全错误,我正在努力解决它!我已经看到有人完全按照我想要通过克隆实现的目标 - 但不是在保存前进行编辑。

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

4

3 回答 3

8

为此,您将不得不创建 Prescription 类的新实例。“dup”有效,但您假设它会覆盖现有记录。只有以 bang(!) 结尾的方法才会这样做。

您的代码应该是:

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 未找到的时间。

于 2012-08-17T07:55:50.093 回答
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

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

于 2012-08-17T07:57:20.227 回答
0

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

@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
于 2013-05-27T13:14:22.300 回答