我正在创建一个观察者模型:booklogger_observer.rb
观察者模型看起来像这样:
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然后将其发送回来进行保存。 / p>
你能帮我理解这个流程吗?
谢谢
答案 0 :(得分:1)
对于观察者中的某些工作,您绝对可以使用常用方法。但另一个答案有几个问题。首先,参数不能是全局的(如def assign_meta(@logitem)
)。其次,调用save实际上返回true或false,而不是对象。
最后,after_save
和after_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等)中访问。并且观察者被重命名为更直观。
我希望这有帮助!
答案 1 :(得分:0)
在ruby中,最后一行是什么输出所以你的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