3

モデルには、Procが添付されたベンダーのコード(変更できません)の中にクラスがあります。シャツクラスの例を考えてみると、コードは以下のようになります。class_evalを使用して、レールでbefore_validationコールバックを削除します。

class Shirt < ActiveRecord::Base 
    before_validation -> { self.size ||= 'medium' } 
    # Some code here 
end 

(コードのこの作品は、デフォルトのシャツのサイズを設定していることに注意してください)

言って、私は今、デコレータクラスの大型にデフォルトのシャツのサイズを変更する必要があります。もとのクラスのbefore_validationコールバックがまだ呼ばれているので、コードが

Shirt.class_eval do 
    before_validation -> { self.size ||= 'large' } 
    # Some more code 
end 

のようになります。ただし、デフォルトのシャツのサイズはまだmediumに設定されています。

元のコードでコールバックを削除し、代わりにclass_evalの検証を使用するという洗練された方法はありますか?

答えて

1

あなたは新しいコールバック設定する前にbefore_validationをスキップすることがあります。

Shirt.class_eval do 
    skip_callback :validation, :before 
    before_validation -> { self.size ||= 'large' } 
    # Some more code 
end 
2

reset_callbacksは、特定のイベントのためにすべてのコールバックを削除します。それはすべてのコールバックを削除するよう

Shirt.class_eval do 
    reset_callbacks(:before_validation) 
end 

これはやや核のオプションです。しかし、実際のコールバックは名前が付けられていないので、特定のコールバックを無視することはできません。私はそれを上流に修正することを検討します(またはモジュールをよりモジュラ化するために実装を変更できるかどうか、著者にうなずきます)。

関連する問題