Ruby gem 中包含的 Monkey Patching Mongoid 模型
Monkey Patching Mongoid models contained in a Ruby gem
我有一个 Ruby gem which gets used across multiple projects,其中包含一些 Mongoid 模型。
我目前正在尝试在一个项目中重用它们,并猴子修补一些额外的方法。但是,当我需要项目和 运行 测试时。我得到一个 NoMethodError
。有什么地方出错了吗?
这是我的主要项目文件:
require 'bundler'
Bundler.require(:default)
require 'mongoid-elasticsearch'
Mongoid::Elasticsearch.prefix = ENV["MONGOID_ENVIRONMENT"]
require 'mongoid_address_models/require_all' # This is where I include my gem
Mongoid.load!(File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml"), ENV["MONGOID_ENVIRONMENT"] || :development)
# Here are my monkey patched models
require 'models/street'
require 'models/locality'
require 'models/town'
require 'models/postcode'
require 'sorting_office/address'
module SortingOffice
end
这是猴子修补模型之一的示例
class Postcode
REGEX = /([A-PR-UWYZ01][A-Z01]?[0-9IO][0-9A-HJKMNPR-YIO]\s?[0-9IO][ABD-HJLNPQ-Z10]{2})/i
def self.calculate(address)
postcode = UKPostcode.new(address.match(REGEX)[0])
where(name: postcode.norm).first
end
end
当我调用 Postcode.calculate(address)(例如)时,我得到一个 NoMethodError
我想我现在已经搞定了。我没有将猴子补丁放在 lib/models
中,而是将它们移动到 lib/sorting_office/models
并像这样要求它们:
require 'sorting_office/models/street'
require 'sorting_office/models/locality'
require 'sorting_office/models/town'
require 'sorting_office/models/postcode'
我仍然有兴趣知道为什么这有效
我有一个 Ruby gem which gets used across multiple projects,其中包含一些 Mongoid 模型。
我目前正在尝试在一个项目中重用它们,并猴子修补一些额外的方法。但是,当我需要项目和 运行 测试时。我得到一个 NoMethodError
。有什么地方出错了吗?
这是我的主要项目文件:
require 'bundler'
Bundler.require(:default)
require 'mongoid-elasticsearch'
Mongoid::Elasticsearch.prefix = ENV["MONGOID_ENVIRONMENT"]
require 'mongoid_address_models/require_all' # This is where I include my gem
Mongoid.load!(File.join(File.dirname(__FILE__), "..", "config", "mongoid.yml"), ENV["MONGOID_ENVIRONMENT"] || :development)
# Here are my monkey patched models
require 'models/street'
require 'models/locality'
require 'models/town'
require 'models/postcode'
require 'sorting_office/address'
module SortingOffice
end
这是猴子修补模型之一的示例
class Postcode
REGEX = /([A-PR-UWYZ01][A-Z01]?[0-9IO][0-9A-HJKMNPR-YIO]\s?[0-9IO][ABD-HJLNPQ-Z10]{2})/i
def self.calculate(address)
postcode = UKPostcode.new(address.match(REGEX)[0])
where(name: postcode.norm).first
end
end
当我调用 Postcode.calculate(address)(例如)时,我得到一个 NoMethodError
我想我现在已经搞定了。我没有将猴子补丁放在 lib/models
中,而是将它们移动到 lib/sorting_office/models
并像这样要求它们:
require 'sorting_office/models/street'
require 'sorting_office/models/locality'
require 'sorting_office/models/town'
require 'sorting_office/models/postcode'
我仍然有兴趣知道为什么这有效