2011-09-20 71 views
45

我想爲我的Rails項目中的不同對象構建一個索引,並且希望添加一個可以在String對象上調用的'count_occurences'方法。在Rails中,如何爲String類添加一個新的方法?

我看見我可以做類似

class String 
    def self.count_occurences 
    do_something_here 
    end 
end 

什麼來定義這種方法的具體方式,以及放置的代碼在我的Rails項目?

感謝

+0

這是醜陋的,如果有什麼的其他庫也增加了一個'count_occurences'方法,它不會完全相同的東西? – arnaud576875

+0

那麼你建議我做什麼? – alex

+0

大概是別的東西沒有這種方法或他已經使用它 – rogerdpack

回答

88

您可以在lib/ext/string.rb定義在應用程序中一個新的類,並把它這個內容:

class String 
    def to_magic 
    "magic" 
    end 
end 

要加載此類,您需要在您的config/application.rb文件或初始化程序中要求它。如果你有很多這樣的擴展,初始化就更好了!加載它的方法很簡單:然後

require 'ext/string' 

to_magic方法將可在情況下,您的應用程序/控制檯內部的String,即:

>> "not magic".to_magic 
=> "magic" 

無插件必要的。

+0

正是我需要的,謝謝!只有一個問題:爲什麼不用「config.autoload_paths + =%W(#{config.root}/lib)」加載文件? – alex

+2

@alex:這將是,但您需要重新啓動服務器或控制檯,具體取決於您使用的訪問方式。 'autoload_paths'選項可以配置包含文件的目錄,這些文件將被自動加載,所以如果不加載,我懷疑你沒有完成我剛纔說的那兩件事情。 –

+0

好的。我只需要知道!非常感謝。順便說一下,我昨天剛剛收到了Action中的Rails 3 ...期待閱讀! – alex

4

當你想延長一些核心類,那麼你通常要創建一個插件(當需要在另一個應用程序的代碼很方便)。在這裏,你可以找到一個指導如何創建一個插件http://guides.rubyonrails.org/plugins.html和點#3你展示如何擴展String類:http://guides.rubyonrails.org/plugins.html#extending-core-classes

+0

有沒有一種方法可以完成同樣的事情,而不必創建一個完整的插件(這對我想完成的工作似乎有很多工作...)? – alex

+1

我知道Ryan發佈的另一個解決方案,它也是正確的。毫無疑問。但我建議你插件,因爲這是我們在我們公司做的。當你創建一個插件,你可以把它放在github上,每個人都可以將它安裝到他/她的應用程序中。我知道這是更多的工作,但通常是值得的。我真的不覺得我應該在這裏扣除點... –

10

我知道這是一箇舊的線程,但它似乎並不像接受的解決方案在Rails 4+中工作(至少不適用於我)。將擴展rb文件放入config/initializers中。

或者,您可以添加/ lib添加到Rails的自動加載磁帶機(在配置/ application.rb中,在應用程序類:

config.autoload_paths += %W(#{config.root}/lib) 

require 'ext/string' 

看到這個: http://brettu.com/rails-ruby-tips-203-load-lib-files-in-rails-4/

相關問題