2016-07-28 8 views
1

私はafter_saveのメソッドを持っていますが(オブジェクトのIDを使用する理由でafter_saveを行う必要があります)、フォームにチェックボックス属性を追加しました。値は、コールバックが保存されるために自然に渡されます。しかし、そのチェックボックスだけが変更された状況では、私はそのメソッドを呼びたくはありません...すべての検証/コールバックを渡したいと思います。 object.changes?にチェックボックス属性しかない場合はチェックできますが、メソッドがafter_saveになったら、その情報はもうありません。 check_method before_saveを実行できますか?保存時にコールバックをスキップするものがあります(どのようになりますか)。それとも別の提案がありますか?ありがとう!Rails - 条件付きスキップコールバック(after_save)

+0

だから、いくつかの理由でスキップコールバックと検証をしたい場合、railsにはいくつかの方法があります。これらのメソッドはSQLでテーブルを直接更新し、コールバックや検証は一切行いません。 [list](http://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks)を見てください。 –

+0

@ArupRakshitしかし問題はそれが私のフォーム上にあり、saveメソッドを呼び出さなければならないということです。しかし、その属性だけが変更された場合は、before_saveをチェックして別のコールバックをスキップしたいとします。 –

+0

「person.name_changed?」のように使用できます。ここで 'name'は' person'モデルの属性です。 –

答えて

0

アトリビュートが変更されたか、変更されるかは、アトリビュートの名前に_changedを追加することでわかります。 after_saveafter_commitコールバックで

オプション1

after_save :some_method 

def some_method 
    if email_changed? 
    // do some stuff 
    end 
end 

オプション2

after_save :some_method, if: :email_changed? 

def some_method 
    // do some stuff 
end 
+0

after_save on attribute_changed?常にfalseを返します。 before_saveコールバックでのみ機能します –

+0

私はRails 5で自分のコードをテストしています。 –

+0

私はRails 3.2.17を使用しています。 after_saveコールバックでは、変更は常に空になります...私のためにbefore_saveでのみ動作します –

0

、あなただけの属性あれば変更属性と短絡をチェックするためにprevious_changesを使用することができますチェックボックス属性がリストされています。

+0

はそれを試しましたが、look:before_save、object.changesは{"desabilita_integracao_sap" => [false、true]}、after_save、object.previous_changesは{ } (空の)。私はレールを使用しています3.それは動作しますか? –

+0

私はこれが当時存在していたことは知っていますが、Rails 3で試したことはありません。後で試して報告します。どのようなバージョンのRails 3を使っていますか? –

+0

it's Rails 3.2.17。私はそれがそのメソッドを持って、原因がいくつかのエラーを提起しなかったと信じて、ちょうど空のハッシュを返しました... –