【问题标题】:Rails model "before_filter"?Rails模型“before_filter”?
【发布时间】:2012-05-01 13:22:49
【问题描述】:

我知道 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 有这样的功能吗?我希望我只是在这里错过了一些明显的东西......

【问题讨论】:

  • 你的意思是Active Record Callbacks
  • 是的,我想我需要一个回调。但是没有一个可用的回调可以做我所追求的。我不是在保存、验证、初始化……我在调用一个方法。
  • 如果满足您的条件,您可以使用代理对象并委托给模型
  • apneadiving - 你能提供更多细节吗?不知道你的意思...

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


【解决方案1】:
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

【讨论】:

  • 这完全按照您的说法运行。它需要我触摸每个模型,但考虑到所有因素,这是一个非常干净的解决方案。非常感谢!
  • 酷 :) 如果您的模型中有重复的模式,您可以考虑将内容提取到模块中。只是一个想法。
【解决方案2】:

我专门为此制作了一颗宝石。

您可以将其插入任何 ruby​​ 类中,并在控制器中执行类似的操作。

before_action :foobar, on: [:foo]

https://github.com/EdmundLeex/action_callback

【讨论】:

  • 不错,但从技术上讲,模型中的方法不是动作,它可能是before_method
猜你喜欢
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多