ユーザーが請求書フォームを更新すると、新しい請求書レコードが更新された属性で作成されますが、古いレコードの1つまたは2つのフィールドも変更され、保存されます。 、あまりにも。同時に新しいインスタンスを更新して作成する
コントローラーアクションの概要はどのように見えるでしょうか?代わりに、私はコールバックを使用して、モデル内のコードを入れてコントローラのアクションの
ユーザーが請求書フォームを更新すると、新しい請求書レコードが更新された属性で作成されますが、古いレコードの1つまたは2つのフィールドも変更され、保存されます。 、あまりにも。同時に新しいインスタンスを更新して作成する
コントローラーアクションの概要はどのように見えるでしょうか?代わりに、私はコールバックを使用して、モデル内のコードを入れてコントローラのアクションの
ネストされた属性は、物事は少しトリッキーました。したがって、新しいインスタンスを作成するには、リソースとそのネストされた項目の両方に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に感謝します。
:
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」しない限り、すべての属性を維持する(そうでない場合、私はエラーを取得する)ために新しいレコードを作成新しい属性。 それから私は、既存のレコードの属性を復元します。私は保存する前にいくつかのカスタム変更を行います。
私はRailsで新しくなっていますが、これはかなり簡単です。
フォームを送信するときに、更新アクションによって簡単に現在のレコードデータが更新されることがありますが、だけでなく、それが自動化されたとして、あなたは明確にする必要がありますが、この
の上に新しいものを作成:新しい請求書レコードがたびに作成されている場合