【问题标题】:Duplicating a record in Rails 3在 Rails 3 中复制记录
【发布时间】:2012-08-13 03:32:49
【问题描述】:

我的 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 完全按照我想要通过克隆实现的目标 - 但不是在保存前进行编辑。

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

【问题讨论】:

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


    【解决方案1】:

    为此,您必须创建一个新的 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 未找到的时间。

    【讨论】:

    • 我认为这是正确的答案,因为 Rails 在模型上使用 dup 时会将 id 设置为 nil,将其视为新的。见apidock.com/rails/ActiveRecord/Core/dup
    • 这就是dup 的用途。制作原始副本的浅表副本,没有 id 和时间戳,仅保留父关联。
    【解决方案2】:

    如果您希望克隆操作允许用户在保存(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
    

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

    【讨论】:

      【解决方案3】:

      我正在寻找克隆现有记录的逻辑。我不得不稍微修改 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
      

      【讨论】:

        猜你喜欢
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        • 2011-07-16
        • 1970-01-01
        相关资源
        最近更新 更多