Rails - 了解如何创建方法?

时间:2010-10-28 02:11:53

标签: ruby-on-rails ruby-on-rails-3

我正在创建一个观察者模型: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>

你能帮我理解这个流程吗?

谢谢

2 个答案:

答案 0 :(得分: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等)中访问。并且观察者被重命名为更直观。

我希望这有帮助!

答案 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