before_create在模型之外

时间:2014-04-19 09:31:42

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

我是Rails的新手,但在使用其他语言(例如Java)编写代码方面有相当多的经验。好吧,我喜欢Ruby的元编程。

通常情况下,当我学习Rails的时候......我看到一些插件,比如public_activity,或其他可以简单地做的事情

include Namespace::SomeModel

而且,在public_activity的情况下,他们的SomeModel方法在创建记录之前以某种方式被调用。我怀疑before_create包含在SomeModel中。所以...我开始尝试但是被困住了,显然,before_create变得不可用于我所拥有的SomeModel类,它位于目录中手动自动加载到rails s上。

我想问的是,如何通过包含SomeModel,其中一个方法是在ActiveRecord上调用create事件?

我刚刚下载了代码的源代码,但是......这需要时间。而且,只是为了预料到我找不到答案;你们是比无声代码更好的老师。所以,给我时间回答即使是最轻微的暗示。感谢。

2 个答案:

答案 0 :(得分:0)

这是一个非常着名的程序

Module NewModule
  extend ActiveSupport::Concern

  def self.included(base)
    base.after_create :a_method
  end

  def a_method
    # your_code_here
  end
end

class A < ActiveRecord::Base
  include NewModule
end

使用ActiveSupport :: Extend,您可以相应地将NewModule的类和实例方法提供给A

NewModule.included代码在NewModule包含在另一个类中时执行。

答案 1 :(得分:0)

Rails允许扩展您包含模块的类。基本技术在http://api.rubyonrails.org/classes/ActiveSupport/Concern.html#method-i-included中描述

这允许&#34;设置&#34;一个模块,比如

module Foo
  extend ActiveSupport::Concern
  included do
    # Within this area "self" now refers to the class in which the module is included
    # Every method you now call is called agains the class

    # As such you can now write things like
    validates_inclusion_of ...
    define_method ...
  end
end