2011-07-23 31 views
2

这更多的是一个理论问题,但我仍然很好奇。我是一个ruby/ruby​​的新手(但在其他语言/框架中有很多古老的经验),所以这主要是一个奇怪的/学习的问题。预先感谢任何帮助!使用Ruby别名来扩展Gem

我以为我可以使用别名如下做​​一个快速的扩展,红宝石宝石:

module InstallMyExtension 
    def self.included(base) 
    base.class_eval { 
     alias :some_method_in_gem_without_my_extension :some_method_in_gem 
     alias :some_method_in_gem :some_method_in_gem_with_my_extension 
    } 
    end 

    def some_method_in_gem_with_my_extension 
    debugger 
    # ... do fun stuff here 
    some_method_in_gem_without_my_extension 
    end 

end 

然后在一些初始化文件我做的:

Foo::SomeControllerInFoo.send :include, InstallMyExtension 

我在辐射知道了这种技术CMS在那里用它来扩展基本行为。我知道这种技术现在已被拒绝,但它似乎是一种快速的方式,只是尝试一些想法,然后在宝石上分支等等。

首先在Rails 3中有更好的方法来做一个快速的黑客扩展这样(这可能是有用的只是为了测试理论,建立该宝石等???之前)

第二关,它不工作了,有许多东西我不明白

然后让我解释一下我看到的奇怪:

即使如果我做了“包括”如上图所示,当我进入我看到一些真正怪异的行为控制台,我不明白:

1)I型富:: SomeControllerInFoo正如我所料,我回到了Foo :: SomeControllerInFoo。但是如果第二次运行相同的精确表达式,Foo :: SomeControllerInFoo会返回undefined!

2)只是为了玩弄我做了foo = Foo :: SomeControllerInFoo,然后我可以做foo.send,foo.methods,无论我喜欢什么,但只有当我将这个类的副本保存在foo中!那是什么? 3)如果我现在做了foo.send:include,MyExtension,调试控制台内的行为就像预期的那样(即,包含在gem中的原始类现在已将我的行为添加到它中)。但是,在运行期间初始化没有效果。什么都没有中断,但控制器没有延长。

回答

1

奇怪的是它不工作,我只是试图再次肯定,并且做的伎俩(把这个代码在一个文件中config/initializers)。

我总是用一个快捷方式:

alias_method_chain :some_method_in_gem, :my_extension 

,而不是两个别名线,但它是完全一样的。

你可以覆盖更容易直接使用class_eval一些方法。同样在初始化:

Foo::SomeControllerInFoo.class_eval do 
    def some_method_in_gem 
    #your redefinition 
    end 
end 

很抱歉,但你的其他问题没有附加值:看来真的很怪异和马车。


只是可以肯定,当你想运行在控制器中定义的方法,这样做:

c = Foo::SomeControllerInFoo.new 
c.method_name 
相关问题