是否可以在模块中定义'before_save'回调?

时间:2011-09-16 12:16:51

标签: ruby-on-rails ruby

是否可以在模块中定义before_save回调?就像这样的类:

class Model
  include MongoMapper::Document
  include MyModule
end

和这样的模块:

module MyModule
  before_save :do_something

  def do_something
    #do whatever
  end  
end 
在保存任何do_something个对象之前,会调用

Model吗?我已经尝试过这样但得到undefined method 'before_save' for MyModule:Module

道歉,如果这很简单 - 我是Ruby和Rails的新手。

3 个答案:

答案 0 :(得分:106)

在Ruby on Rails< 3(没有Rails功能,只有Ruby)

module MyModule
  def self.included(base)
    base.class_eval do
      before_save :do_something
    end
  end

  def do_something
    #do whatever
  end
end

在Ruby on Rails中> = 3(使用Rails Concern功能)

module MyModule
  extend ActiveSupport::Concern

  included do
    before_save :do_something
  end

  def do_something
    #do whatever
  end
end

答案 1 :(得分:4)

模块的included方法可能就是您所需要的。

http://www.ruby-doc.org/core-2.1.2/Module.html#method-i-included

答案 2 :(得分:0)

您可以使用ActiveSupport :: Concern执行此操作(实际上没有它,但它更清晰,更首选)

require 'active_support/concern'

module MyModule
  extend ActiveSupport::Concern

  included do
    # relations, callbacks, validations, scopes and others...
  end

  # instance methods

  module ClassMethods
    # class methods
  end
end