2011-07-23 66 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 
相關問題