【问题标题】:Trouble on extending Rails in a sub-directory of the 'lib' directory在“lib”目录的子目录中扩展 Rails 时遇到问题
【发布时间】:2012-12-03 08:07:49
【问题描述】:

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

# 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)

注意二:如果我将custom_validator.rb 文件“直接放在”lib/ 目录下(即,没有“子目录”该文件),然后我使用以下代码它有效。

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

【问题讨论】:

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


【解决方案1】:

尝试在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

【讨论】:

  • 您可能需要将以下内容添加到文件的开头。见编辑。 $:.unshift File.expand_path(File.dirname(FILE))
  • $:.unshift File.expand_path(File.dirname(__FILE__)) 代码是什么?它的用途是什么?但是,即使添加该代码,我仍然收到Unknown validator: 'CustomValidator' 错误。似乎从未加载过extension.rb 文件...
  • 此代码将当前文件夹添加到加载路径。您已经在 application.rb 中做过,但我认为它可能会有所帮助
  • 能否请您发布模型的代码(您如何在模型中包含验证器?)
  • 我做 not include CustomValidator 模型中的类。它继承自 ActiveModel::EachValidator,我在与自定义验证器相关的 official documentation 中的第二个示例中使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2019-10-16
  • 1970-01-01
  • 2011-02-28
  • 2012-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多