0

**更新**それはすべてカスタムバリデーターに関連しているようです:それを削除すると、期待どおりに機能します。最後のコードを参照 **

budget私は多くのモデルを持っていますmulti_year_impacts

コンソールで、次を実行すると:

b = Budget.find(4)
b.multi_year_impacts.size #=> 2
b.update_attributes({multi_year_impacts_attributes: {id: 20, _destroy: true} } ) #=> true
b.multi_year_impacts.size #=> 1 (so far so good)
b.reload
b.multi_year_impacts.size #=> 2 What???

b.reloadそして、私がする前にb.save(とにかく必要ではないはずです)、それは同じです。

子レコードが破棄されない理由は何ですか?

念のため、いくつかの追加情報:

レール 3.2.12

budget.rb

attr_accessible :multi_year_impacts_attributes
has_many :multi_year_impacts, as: :impactable, :dependent => :destroy
accepts_nested_attributes_for :multi_year_impacts, :allow_destroy => true
validates_with MultiYearImpactValidator # problem seems to com from here

multi_year_impact.rb

belongs_to :impactable, polymorphic: true

multi_year_impact_validator.rb

class MultiYearImpactValidator < ActiveModel::Validator
  def validate(record)
    return false unless record.amount_before && record.amount_after && record.savings        
    lines = record.multi_year_impacts.delete_if{|x| x.marked_for_destruction?}

    %w[amount_before amount_after savings].each do |val|
      if lines.inject(0){|s,e| s + e.send(val).to_f} != record.send(val)
        record.errors.add(val.to_sym, " please check \"Repartition per year\" below: the sum of all lines must be equal of total amounts")
      end
    end

  end
end
4

2 に答える 2

0

どうやら犯人はここにいたようです

if lines.inject(0){|s,e| s + e.send(val).to_f} != record.send(val)
    record.errors.add(val.to_sym, " please check \"Repartition per year\" below: the sum of all lines must be equal of total amounts")
end

これをもう少し複雑なものに変更する

  total = 0
  lines.each do |l|
    total += l.send(val).to_f unless l.marked_for_destruction?
  end
  if total != record.send(val)
    record.errors[:amount_before] << " please check \"Repartition per year\" below: the sum of all lines must be equal of total amounts"
  end

問題を解決しました。

于 2013-03-02T17:23:23.503 に答える