2016-05-09 98 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很新,但這看起來很簡單。正如你所提到的用戶正在'更新'一張發票,你的控制器視圖可能已經通過了所有數據供用戶進一步修改。

當你提交表單時,你的更新操作可以很容易地更新當前記錄數據,還有,因爲它是自動創建這個

雖然之上的新的,你需要明確:

  • 如果一個新的發票記錄每一個發票記錄
    更新時間(創建可以創建相同發票的很多副本)
  • 你如何使舊記錄存檔,以避免重複
  • 可以在「附加」的修訂是自動的,很容易通過一個算法處理...