在'lib'目录的子目录中扩展Rails的麻烦

时间:2012-12-15 15:51:31

标签: ruby-on-rails ruby ruby-on-rails-3 validation extending

我正在使用Ruby on Rails 3.2.9,我想扩展框架,custom validator位于lib/目录的子目录中。我实现了以下内容:

# lib/extension/rails/custom_validator.rb
module Extension
  module Rails
    class CustomValidator < ActiveModel::EachValidator
      # ...
    end
  end
end

重新启动服务器后,出现Unknown validator: 'CustomValidator'错误。我该如何解决这个问题呢?


注意我:在config/application.rb文件中,我说config.autoload_paths += %W(#{config.root}/lib)

注意II :如果我将custom_validator.rb文件“直接放在”lib/目录下(即没有“子导演”文件)并且我使用以下代码然后工作。

# lib/custom_validator.rb
class CustomValidator < ActiveModel::EachValidator
  # ...
end

1 个答案:

答案 0 :(得分:0)

尝试在名为“extension.rb”的lib文件夹中包含以下内容

$:.unshift File.expand_path(File.dirname(__FILE__))

module Extension
    module Rails
        autoload :CustomValidator, "extension/rails/custom_validator"
    end
end

结帐http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.htmlhttps://github.com/macournoyer/thin/blob/c8f4627bf046680abb85665f28ab926e36c931db/lib/thin.rb了解如何使用此技术。

前面的代码假定您已经编写了如下的

验证器
# lib/extension/rails/custom_validator.rb
module Extension
  module Rails
    class CustomValidator < ActiveModel::EachValidator
      # ...
    end
  end
end

并且您已将其包含在您的模型中,如下所示

class MyModel
  validates_with Extension::Rails::CustomValidator
end

另一种选择是如下定义验证器

# lib/extension/rails/custom_validator.rb

class CustomValidator < ActiveModel::EachValidator
  # ...
end

然后将其目录添加到应用程序的加载路径

# config/application.rb
config.autoload_paths += %W(#{config.root}/lib/extension/rails)

在您的模型中使用以下内容验证

class MyModel
  validates :my_property, :presence => true, :custom => true
end