2

モデルが更新される前に属性が変更されたかどうかを検出したいと考えています。

私は次のものを持っています(ベース: http://api.rubyonrails.org/classes/ActiveModel/Dirty.html ):

before_update :changed_attributes

def changed_attributes
    self.path_changed? ? puts('Path was changed') : puts('Path was not changed')
end

しかし、Model.path 属性を編集しようとすると、次のエラーが発生します。

SystemStackError: stack level too deep

これは、無限再帰が発生していることを意味します。

SystemStackError を作成せずにこれを行う正しい方法は何ですか?

4

1 に答える 1

4

問題は、ActiveRecord に既に というメソッドがあることchanged_attributesです。ほとんどの場合、 をpath_changed?呼び出しchanged_attributesますが、再定義changed_attributesしたため、 が含まれていますpath_changed?。これにより、無限の再帰が発生し、最終的にスタック レベルが深すぎます。

メソッドの名前をcheck_changed_attributes何かに変更してみてください:

before_update :check_changed_attributes

def check_changed_attributes
  self.path_changed? ? puts 'Path was changed' : puts 'Path was not changed'
end
于 2013-04-01T07:52:18.333 に答える