2016-05-09 15 views
0

ユーザーが請求書フォームを更新すると、新しい請求書レコードが更新された属性で作成されますが、古いレコードの1つまたは2つのフィールドも変更され、保存されます。 、あまりにも。同時に新しいインスタンスを更新して作成する

コントローラーアクションの概要はどのように見えるでしょうか?代わりに、私はコールバックを使用して、モデル内のコードを入れてコントローラのアクションの

答えて

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で新しくなっていますが、これはかなり簡単です。

フォームを送信するときに、更新アクションによって簡単に現在のレコードデータが更新されることがありますが、だけでなく、それが自動化されたとして、あなたは明確にする必要がありますが、この

の上に新しいものを作成:新しい請求書レコードがたびに作成されている場合

  • を請求書レコードが更新さ
    (あります同じ請求書のコピーをたくさん作成することができます)
  • 古い記録に重複
  • が「追加」の改正を自動化し、簡単なアルゴリズムを通じて処理することができますを避けるためにアーカイブを作成する方法
  • ...
関連する問題