2017-11-24 17 views
0

PostとAuditLogの2つのモデルがあります。これらは互いに関連付けられていないため、投稿が削除された後にAudiLogモデルでアクションをトリガーしたいと思います。投稿が保存され、after_saveがうまく動作するが、after_destroyは保存されていないので、AuditLogモデルで起こるポストモデルでは、他のコールバックもある。だから、After_destroyは機能しません

class Post < ApplicationRecord 
    after_save :confirm_audit_log, if: :submitted? 
    after_destroy :say_goodbye 

    private 

    def confirm_audit_log 
    audit_log = AuditLog.where(user_id: self.user_id, 
       start_date: (self.date - 7.days..self.date)).last 
    audit_log.confirmed! if audit_log 
    end 

    def say_goodbye 
    "Goodbye!" 
    end 
end 

私が見るべきである投稿を削除した後に「さようなら」が、私は

Post.last.destroy 

を行う際のポストインスタンスがデータベースから削除されますが、コールバックが呼び出されません。なぜ私に説明していただけますか?

UPDATE: 私はafter_destroyでこのmetodに変更されました:

def unconfirm_audit_log 
    audit_log = AuditLog.where(user_id: self.user_id, 
       start_date: (self.date - 7.days..self.date)).last 
    audit_log.pending! 
end 

、それが呼び出されることはありませんです。私はuncofirm_audit_logメソッドの中にデバッガを置こうとしましたが、それはそこに届くことさえありません。

+0

あなたはレールとルビーのどのバージョンを使用していますか? – imechemi

+1

'投稿を削除した後、「さようなら」と表示されるはずです - あなたは「さようなら」のテキストを印刷せず、メソッドから返すだけです。 ''さようなら」を試してみてください。 –

+0

'after_destroy:unconfirm_audit_log'を' Post'モデルに追加しましたか? –

答えて

1

変更after_destroy~before_destroyselfにはオブジェクトが破棄されているので、あなたはゼロになると思います。

ので、コードの下に試してみてください。

class Post < ApplicationRecord 
    after_save :confirm_audit_log, if: :submitted? 
    before_destroy :unconfirm_audit_log 

    private 

    def confirm_audit_log 
    audit_log = AuditLog.where(user_id: self.user_id, 
       start_date: (self.date - 7.days..self.date)).last 
    audit_log.confirmed! if audit_log 
    end 

    def unconfirm_audit_log 
    audit_log = AuditLog.where(user_id: self.user_id, 
       start_date: (self.date - 7.days..self.date)).last 
    audit_log.pending! 
    end 
end 
+0

はい、そうでした!あなたは天才です:)))私はまだコールバックがRailsでどのように動作するかを学んでいます。あなたのお役に立ってくれてありがとう! – jedi

+0

@jediあなたのために働く場合は、私の答えを受け入れてください。ありがとう – puneet18

関連する問題