2011-05-01 66 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