问题 Rails模型“before_filter”?


我知道before_filter只适用于Rails中的控制器,但是对于模型我想要这样的东西:每次调用模型中的方法时,我都想运行一个方法来确定被调用的方法是否应该运行。从概念上讲,这样的事情:

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,则不会运行method1。 Rails有这样的功能吗?我希望我只是错过了一些明显的东西......


6169
2018-05-01 13:22


起源

你意思是 活动记录回调? - Mischa
是的,我想,我需要一个回调。但是没有一个可用的回调可以做我想要的。我不是在保存,验证,初始化...我正在调用一种方法。 - Aaron Vegh
如果符合条件,您可以使用代理对象并委托给模型 - apneadiving
apneadiving - 你能提供更多细节吗?不明白你的意思... - Aaron Vegh
看到 simonecarletti.com/blog/2010/05/... - apneadiving


答案:


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


12
2018-05-01 14:02



这完全按照你的说法运行。它需要我触摸每个模型,但它是一个非常干净的解决方案,所有的事情都考虑在内。非常感谢! - Aaron Vegh
很酷:)如果您的模型中存在经常性模式,您可以考虑将内容提取到模块中。只是一个想法。 - Robin


我为此制作了一颗宝石。

你可以在任何ruby类中插入它,并在控制器中执行类似的操作。

before_action :foobar, on: [:foo]

https://github.com/EdmundLeex/action_callback


1
2018-01-08 07:01