2012-10-12 41 views
0

我有一個包含在Rails Observer中的模塊。未定義方法的別名方法鏈

的目的是:在after_saveafter_update名爲check_integrity

  • 呼叫check_integrityafter_save或/和after_update結束時,如果在該觀察中定義方法

    • 呼叫。

    所以總之應該總是叫check_integrity

    我試過的東西,看起來像下面的代碼:

    module IntegrityObserver 
        extend ActiveSupport::Concern 
    
        included do 
        alias_method_chain :after_save, :check_integrity 
        alias_method_chain :after_update, :check_integrity 
        end 
    
        def check_integrity 
        # do something 
        end 
    end 
    
    class UserObserver < ActiveRecord::Observer 
        include IntegrityObserver 
    
        def after_save(object) 
        # do something 
        end 
    end 
    

    但它引發錯誤:activesupport-3.0.17/lib/active_support/core_ext/module/aliasing.rb:31:in alias_method': undefined method after_update' for class TaskObserver' (NameError)

    有人有任何想法我怎麼做我想要什麼?

    謝謝!

  • +0

    是'包括CacheObserver'行意在'包括IntegrityObserver'? TaskObserver到哪裏去了?在'after_save'定義之後包含模塊*是否有幫助? – x1a4

    +0

    謝謝我修復了@ x1a4,包括after_save會工作但不是當方法未定義時 – jrichardlai

    回答

    1

    ActiveRecord已經提供了觀察者功能來監視模型的生命週期。這裏是你如何可以註冊一個通用的觀察者這是爲了響應多個模型:

    class AuditObserver < ActiveRecord::Observer 
        observe :account, :balance 
    
        def after_update(record) 
        AuditTrail.new(record, "UPDATED") 
        end 
    end 
    

    在你的config/application.rb中的文件:

    config.active_record.observers = :audit_observer 
    

    簽出更多的實例here

    1

    alias_method_chain不能這樣工作。如果定義是這樣的:

    alias_method_chain :after_save, :check_integrity 
    

    你必須定義如下方法:

    def after_save_with_check_integrity(*args) 
        # do something 
        # you can call the original after_save by calling: 
        # after_save_without_check_integrity(*args) 
    end 
    

    只是知道,alias_method_chain用途是被認爲是不好的做法,大多數情況下。

    0

    不像模型,觀察者沒有預定義的回調方法,比如after_save,after_update。所以你有一個「未定義的方法」的錯誤。

    你可能不喜歡這樣,

    module IntegrityObserver 
        extend ActiveSupport::Concern 
    
        def after_save(record) 
        check_integrity 
        end 
    
        def after_update(record) 
        check_integrity 
        end 
    
        def check_integrity 
        # do something 
        end 
    end