2010-10-28 33 views
0

我創建一個觀察者模式:booklogger_observer.rbRails - 瞭解如何創建方法?

觀察員模式看起來有點像這樣:

class BookLoggerObserver < ActiveRecord::Observer 
    observe :book 

    def after_create(record) 
    @logitem = ......app specific stuff 
    @logitem = ...... 
    @logitem = ...... 
    assign_meta(@logitem) 
    @logitem.save! 
    end 

    def after_save(record) 
    @logitem = ...... 
    @logitem = ...... 
    @logitem = ...... 
    assign_meta(@logitem) 
    @logitem.save! 
    end 

    def assign_meta(@logitem) 
    @logitem = ...... 
    @logitem = ...... 
    @logitem = ...... 
    end 

end 

如果我堅持是我想用DEF assign_meta執行該行動在after_create和after_save中是很常見的,但我並不熟悉將@logitem傳遞給DEF,然後將其發回以保存。

你能幫我理解這個流程嗎?

謝謝

+0

這將會是容易得多,如果你提供的「應用程序具體的東西」,以幫助您正確的,因爲它似乎不可思議,你要指定'@ logitem'到許多東西,最後調用'#save之前!'上它的最後一個版本。 – 2010-10-28 02:24:58

回答

0

在紅寶石的最後一行的輸出是什麼讓你after_save的和after_create將包含@logitem所以就沒有必要將它傳遞迴DEF。

你也不需要after_create因爲創建需要保存所以它只是多餘的。

您可能也僅僅保存變量在assign_meta如果你不需要做任何事情與它,但你可以在原來的DEFS它保存了。

使用這個,如果你不分配的元信息

def assign_meta(logitem) 
    logitem = ..... 
    logitem.save(false) 
end 

使用這個,如果你需要做更多的工作,回到了原來的DEF後有業務。

def assign_meta(@logitem) 
    @logitem = ..... 
    @logitem.save(false) 
end 
1

你可以絕對使用一種常見的方法來完成觀察者的一些工作。但其他答案有幾個問題。首先,參數不能是全局的(如def assign_meta(@logitem))。其次,調用save實際上返回true或false,而不是對象。

最後,after_saveafter_create之間存在差異,這就是它們都存在的原因。 after_create只允許您在記錄是全新的時候執行某些操作 - 例如創建依賴關係。

我有問題@logitem - 這是什麼?另外,如果你正在觀察書籍模型,那麼爲什麼這被稱爲書籍記錄器觀察者?既然你的例子純粹是虛構的,我會嘗試創建一個有效的例子,並且更清晰。我假設一個「logitem」是你必須設置跟蹤網站事件的另一種模式:

class BookObserver < ActiveRecord::Observer 
    def after_create(book) 
    @log_item = LogItem.new :action => "created book" 
    assign_meta(@log_item, book) 
    @log_item.save! 
    end 

    def after_save(book) 
    @log_item = LogItem.new :action => "saved book" 
    assign_meta(@log_item, book) 
    @log_item.save! 
    end 

    protected 

    def assign_meta(log_item, book) 
    log_item.item_name = book.name 
    end 
end 

在這個例子中,創建一個新的log_item。給出動作描述,然後在assign_meta方法中設置常用數據(本例中爲item_name)。它是受保護的,因爲它只能從其他實例方法(after_create,after_save等)中訪問。觀察員被重新命名爲更直觀。

我希望這有助於!