Rails如何将观察者添加到一个自定义方法

时间:2011-10-26 12:36:41

标签: ruby-on-rails ruby observer-pattern

我想创建一个只观察一种自定义方法的观察者。

我得到了巴纳模特。对于image方法的每次调用,我想增加pageview字段。

class Baner < ActiveRecord::Base

has_attached_file :image

def pageview_inc
  pageview += 1
  save
end

alias old_image image

def image
  old_image
end
end

是否可能只为一个自定义方法设置观察者? 在执行image方法调用pageview_inc方法之后。

修改

如果我改变

的方法
  def image                                                            
    old_image
    self.pageview   += 1
    self.save!
  end

我得到stack level too deep.

的效果相同
  def image    
    self.pageview   += 1
    self.save!                                                        
    old_image
  end

2 个答案:

答案 0 :(得分:1)

class Baner < ActiveRecord::Base

  has_attached_file :image

  alias_method :old_image, :image

  def image
    increment!(:pageview)
    old_image
  end
end

这里有两件事:

1)看到这个问题:Should I use alias or alias_method?

2)increment!将更新计数器而不保存整个模型,避免在保存过程中可能调用image(从而导致递归循环)。

答案 1 :(得分:0)

这应该可以实现你的目标:

def image
  old_image
  write_attribute("pageview", pageview + 1)
end