2010-10-28 34 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等)中访问。观察员被重新命名为更直观。

我希望这有助于!