2

私はレールを初めて使用し、最初のレール プロジェクトの 1 つに取り組んでいます。これは、請求書フォーム内にネストされた明細項目を持つ請求書アプリです。請求書を保存する前に、請求書の合計を計算したいと考えています。保存プロセス中に項目を追加した場合はうまく保存されますが、ネストされた項目の 1 つが削除されるようにタグ付けされている場合、合計が正しく計算されません。正しい合計請求額を取得するには、戻ってもう一度保存する必要があります。

class Invoice < ActiveRecord::Base
  attr_accessible :job_name, :items_attributes, :tax1, :tax2, :subtotal

  before_save :calculate_totals


  has_many :items, :dependent => :destroy
  accepts_nested_attributes_for :items, allow_destroy: true

  private

  def calculate_totals
    self.subtotal = 0

    self.items.each do |i|
      self.subtotal = self.subtotal + (i.quantity * i.cost_per)
    end
  end
end

これが params とどのように異なるかは確かですが、問題の項目レコードは要求されたパラメーターに :_destroy = true でリストされています

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"+OqRa7vRa1CKPMCdBrjhvU6jzMH1zQ=",
 "invoice"=>{"client_id"=>"1",
 "job_name"=>"dsdsadsad",
 "items_attributes"=>{"0"=>{"name"=>"jhksadhshdkjhkjdh",
 "quantity"=>"1",
 "cost_per"=>"50.0",
 "id"=>"21",
 "_destroy"=>"false"},
 "1"=>{"name"=>"delete this one",
 "quantity"=>"1",
 "cost_per"=>"10.0",
 "id"=>"24",
 "_destroy"=>"true"}}},
 "commit"=>"Update Invoice",
 "id"=>"8"}

助けてくれてありがとう。

4

3 に答える 3

2

うまくいくと思われる解決策を見つけました:

class Invoice < ActiveRecord::Base
  attr_accessible :job_name, :items_attributes, :tax1, :tax2, :subtotal

  before_save :calculate_totals


  has_many :items, :dependent => :destroy
  accepts_nested_attributes_for :items, allow_destroy: true

  private
    def calculate_totals
      self.subtotal = 0

      self.items.each do |i|
        unless i.marked_for_destruction?
          self.subtotal += (i.quantity * i.cost_per)
        end
      end

end

キーは、marked_for_destruction? メソッドです。この場合、破棄のマークが付けられていないアイテムをチェックしていました。それを説明するレールAPIへのリンクは次のとおりです:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

ありがとうスティーブ

于 2012-11-15T14:04:33.947 に答える
0
params[:invoice][:items_attributes].each do |i|
  self.subtotal = self.subtotal + (i[:quantity].to_f * i[:cost_per].to_f) unless i['_destroy'] == 'true'
end
于 2012-11-15T02:49:59.903 に答える
0

保存するInvoiceに項目を計算したため、API ドキュメントのガイドのように、計算された項目も破棄されました。

親が保存されるまで、モデルは破棄されないことに注意してください。

before_saveしたがって、に変更するだけafter_saveで機能します。

于 2012-11-15T06:14:57.270 に答える