仅在从某些控制器调用时禁用模型的after_find

时间:2010-03-23 21:11:08

标签: ruby-on-rails ruby activerecord callback

我在模型中有一个after_find回调函数,但我需要在特定的控制器操作中禁用它,例如。

def index
  @people = People.find(:all) # do something here to disable after_find()?
end

def show
  @people = People.find(:all) # after_find() should still be called here!
end

最好的方法是什么?

  1. 我可以将某些内容传递给.find以禁用所有/特定回调吗?
  2. 我可以以某种方式获取模型中的控制器名称,而不是根据控制器名称执行回调(我不喜欢这样)..?
  3. 帮助!

2 个答案:

答案 0 :(得分:2)

  

@@ callback_after_find

不要忘记恢复它。也许它会更好。

class People
  def self.skip_after_find
    @@callback_after_find = false
    yield
  ensure
    @@callback_after_find = true
  end 
  def after_find
    return unless @@callback_after_find
    ...
  end
  private
  @@callback_after_find = true
end

People.skip_after_find do
  @people = People.find(:all) # do something here to disable after_find()?
end

答案 1 :(得分:0)

您可以在模型上添加一个标志,以定义是否要执行after_find。

class People
  @@callback_after_find = true
  def after_find
    return unless @@callback_after_find
    ...
  end
end

在您的控制器中,您现在可以激活或不激活此回调

def index
  People.callback_after_find = false
  @people = People.find(:all) # do something here to disable after_find()?
end

def show
  @people = People.find(:all) # after_find() should still be called here!
end