2012-05-01 40 views
11

我知道before_filter只适用于Rails中的控制器,但是我希望模型能够这样:任何时候调用模型中的某个方法,我想运行一个方法来确定被调用的方法是否应该运行。从概念上讲,这样的事情:Rails模型“before_filter”?

class Website < ActiveRecord::Base 
    before_filter :confirm_company 

    def confirm_company 
    if self.parent.thing == false? 
     return false 
    end 
    end 

    def method1 
    #do stuff 
    end 

end 

所以,当我打电话@ website.method1,它会先调用confirm_company,如果我返回false,将不会运行方法1。 Rails是否具有这样的功能?我希望我只是错过了一些东西很明显这里...

+1

你的意思[Active Record的回调(http://guides.rubyonrails.org/active_record_validations_callbacks.html#callbacks-overview)? – Mischa

+0

是的,我想,回调是我需要的。但没有可用的回调可以做我以后的事情。我不保存,验证,初始化...我正在调用一种方法。 –

+0

如果您的条件得到满足,您可以使用代理对象并将代表委托给模型 – apneadiving

回答

12
class MyModel 
    extend ActiveModel::Callbacks 
    define_model_callbacks :do_stuff 

    before_do_stuff :confirm 

    def do_stuff 
     run_callbacks :do_stuff do 
      #your code 
     end 
    end 

    def confirm 
     #confirm 
    end 
end 

我真的不知道这会的工作,但你可以尝试一下,因为我真的不现在有时间。看看那个:http://api.rubyonrails.org/classes/ActiveModel/Callbacks.html

+0

这完全按照您的说法运行。它要求我触摸每一个模型,但这是一个非常干净的解决方案,所有事情都考虑在内。非常感谢! –

+0

酷:)如果你的模型中有复发模式,你也许可以考虑将东西抽取到模块中。只是一个想法。 – Robin