0

我正在使用 Ruby on Rails 3.2.9,我想使用位于目录子目录中的自定义验证器lib/来扩展框架。我实现了以下内容:

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

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


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

注意二:如果我将custom_validator.rb文件“直接放在”lib/目录下(即,没有“子目录”文件)并且我使用以下代码,那么它可以工作。

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

1 回答 1

0

尝试在 lib 文件夹中有一个名为“extension.rb”的文件,内容如下

$:.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
于 2012-12-15T16:26:37.183 回答