2014-07-03 93 views
0

我的任務是爲Rails應用程序(Foreman)實現一個非常基本的功能請求,並且偶然發現了一個似乎既非常基本又非常流行的問題。從Java背景來看,我發現回調不像我通常所期望的那樣工作。Ruby on Rails - 回調

通常在Java中使用偵聽器時,可以爲事件訂閱任意代碼片段,並且當事件觸發時,對象遍歷偵聽器並通知每個偵聽器。一個非常簡單的例子是:

public class Foo { 
    private List<FooListener> foo_list = new List<FooListener>(); 
    public void add_foo_listener(FooListener fooListener){ 
     this.foo_list.add(fooListener); 
    } 
    private void on_foo_thing(){ 
     foreach(foo : foo_list) { 
      fooListener.notify(); 
     } 
    } 
} 

所以,你可以通過調用「add_foo_listener(FooListener的)」的時候,on_foo_thing()方法被調用,將被通知增加從外部類然而,許多聽衆 - 無需任何修改原創課。

ruby​​/rails中是否有類似的東西?我想勾入類具有以下掛鉤定義:

define_model_callbacks :build, :only => :after 
define_model_callbacks :provision, :only => :before 

# Custom hooks will be executed after_commit 
after_commit :build_hooks, :if => :persisted? 

def build_hooks 
    return unless respond_to?(:old) && old && (build? != old.build?) 
    if build? 
     run_callbacks :build do 
     logger.debug { "custom hook after_build on #{name} will be executed if defined." } 
     end 
    else 
     run_callbacks :provision do 
     logger.debug { "custom hook before_provision on #{name} will be executed if defined." } 
     end 
    end 
    end 
+0

可能重複[我怎樣使用Ruby元編程將回調添加到Rails模型?](http://stackoverflow.com/questions/12084234/how-do-i-use-ruby-metaprogramming-to-add-callbacks-to-a-rails-model ) – Benj

+0

如果我錯了,請糾正我,但從我對ActiveSupport :: Concern的理解中,我將不得不編輯原始類定義以包含我的關注類,這個答案似乎可以重新執行。 – HeWhoWas

回答

0

雖然可能重複的是正確的,爲了改變軌道模型無需編輯該模型的代碼,明確列入聽了,你使用以下:

Host::Managed.send(:include, ::HostExtensions::ManagedHost) 

這是告訴主持人::託管類,它應該包括HostExtensions ::在運行時ManagedHost的模塊。

而對完整性的考慮,如果你在一個Rails應用程序這樣做,你可能需要像這樣添加到您的引擎類(engine.rb)的

config.to_prepare do 
    require File.expand_path('../../../app/models/concerns/host_extensions/managedhost', __FILE__) 
    Host::Managed.send(:include, ::HostExtensions::ManagedHost) 
end