2011-05-01 84 views
6

我想補充的方法nil_or_empty?所有類,所以我定義如何在Rails中擴展類對象?

module ObjectExtensions 
    def nil_or_empty? 
    return self.nil? || (self.respond_to?('empty?') && self.empty?) 
    end 
end 
::Object.class_eval { include ::ObjectExtensions } 

它在一個簡單的Ruby腳本正常工作

p nil.nil_or_empty? #=> true 
p ''.nil_or_empty? #=> true 
p [].nil_or_empty? #=> true 
p 0.nil_or_empty? #=> false 

然而,當我把它添加到我的庫文件lib/extensions.rb一個Rails 3的應用程序,它似乎沒有添加

NoMethodError (undefined method `nil_or_empty?' for nil:NilClass): 
    app/controllers/application_controller.rb:111:in `before_filter_test' 

我加載庫文件(所有其他extensio ns從那個文件工作正常)和

# config/application.rb 
# ... 
config.autoload_paths << './lib' 

我在哪裏錯了?

+0

可能的重複http://stackoverflow.com/questions/5654517/in-ruby-on-rails-to-extend-the-string-class-where-should-the-code-be-put-in – 2011-05-01 08:34:07

回答

16

首先,它的清潔劑只是直接重新Object類:

class Object 
    def nil_or_empty? 
    nil? || respond_to?(:empty?) && empty? 
    # or even shorter: nil? || try(:empty?) 
    end 
end 

其次,告訴Rails的自動加載/ lib目錄並不意味着在/ lib中的文件被加載,當你的應用程序啓動 - 這意味着當你使用一個當前未定義的常量時,Rails將在/ lib中查找與該常量相對應的文件。例如,如果您在Rails應用程序代碼中引用了ObjectExtensions,並且它尚未在某處定義,則Rails會希望在lib/object_extensions.rb中找到它。

因爲你不能在/ lib目錄擴展核心類這樣的,這是一個好主意,把核心擴展在你的配置/初始化目錄。當您的應用啓動時,Rails會自動加載其中的所有文件。所以試着把上面的Object擴展放在config/initializers/object_extension.rb或config/initializers/extensions/object.rb或類似的東西中,並且一切都應該正常工作。

+0

謝謝,現在我正在做正確的方式。 – Andrei 2011-05-01 10:34:19

+0

它爲我工作!謝謝! – 2011-06-21 03:00:58

+0

爲什麼你不能在lib中擴展核心類? – 2013-05-08 08:27:33

7

在這種特殊情況下,你可以只使用了Rails提供的Object#blank?。相反,有Object#present?

#blank?與您的方法類似,但也認爲所有空白字符串如"   "爲空白。

+0

這正是我所期待的。釘! – Andrei 2011-05-01 10:32:19