2016-05-09 179 views
0

当用户更新发票表单时,我想创建一个新的具有更新属性的发票记录,但还要更改旧记录的一个或两个字段并保存它也是。同时更新和创建新实例

控制器动作的轮廓看起来像什么可以做到这一点?

回答

0

嵌套属性使事情有点棘手。所以为了创建新的实例,我必须为资源及其嵌套项目使用dup方法。

一般来说,建议保持控制器纤细,并使模型变胖。不过,我已决定包括该代码为我的发票控制器:

def revise_save 
    @contact = Contact.find(params[:contact_id]) 
    @invoice = @contact.invoices.find(params[:invoice_id]) 
    @invoice_old = @invoice.dup 
    @invoice.invoice_items.each do |item| 
    @invoice_old.invoice_items << item.dup 
    end 

    @invoice.datum = DateTime.now.to_date 

    # archive old invoice 
    # @invoice_old. ... 

    @invoice_old.save 

    # make old new invoice 

    @invoice.datum = Time.now 
    # ... 
    @invoice.update(invoice_params) 

    redirect_to invoices_path 

end 

注意,在这种解决方案当前编辑的(原)发票成为新的发票,旧的矛盾是重新创建。

感谢@ iwan-b指引我朝着正确的方向。

1

而是一个控制器动作我把代码中的模型,利用回调:

before_save do |rec| 
    if !rec.new_record? 
     attrb = rec.attributes.delete_if{|k, v| ["id"].include? k } 
     Book.create(attrb) 

     rec.restore_attributes 
     rec.year = rec.year + 2 # some custom change 
     true 
    end 
    end 

我把所有属性,除非“ID”(否则我得到一个错误)用于创建具有新纪录新的属性。 然后我恢复现有记录的属性。我在保存之前做了一些自定义更改。

1

我对Rails很新,但这看起来很简单。正如你所提到的用户正在'更新'一张发票,你的控制器视图可能已经通过了所有数据供用户进一步修改。

当你提交表单时,你的更新操作可以很容易地更新当前记录数据,还有,因为它是自动创建这个

虽然之上的新的,你需要明确:

  • 如果一个新的发票记录每一个发票记录
    更新时间(创建可以创建相同发票的很多副本)
  • 你如何使旧记录存档,以避免重复
  • 可以在“附加”的修订是自动的,很容易通过一个算法处理...