Когда я создаю экземпляр объекта в режиме разработки, список включенных моделей объекта корректен.
Однако в производственном режиме список включенных модулей включает в себя дополнительный модуль, который совершенно неверен и приводит к ошибочным результатам. ,
Я запустил один и тот же код как в режиме разработки, так и в режиме производства.
require 'blog_import_as'
options = cmd_hdr BLOG_IMPORT
raise "file #{options.file_name} doesn't exist".light_red unless File.exists?(options.file_name)
Blog.transaction do
bia = BlogImportAs.new
ap "#{Rails.env} mode "
ap "before extend"
ap bia.singleton_class.included_modules
if File.basename(options.file_name) =~ /^parked-blogs-.*\.csv/
bia.extend(Buildable)
ap "after Buildable extend"
ap bia.singleton_class.included_modules
end
if File.basename(options.file_name) =~ /^built-blogs-.*\.csv/
bia.extend(Deployable)
ap "after Deployable extend"
ap bia.singleton_class.included_modules
end
...
Объект определен как:
class BlogImportAs # application server version
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
FILE_TYPES = %w{ .csv }
attr_accessor :file, :role
default_define_debug # makes a dummy method debug!
validates :file, presence: true
validates :role, presence: true
def initialize(attributes = {})
attributes.each { |name, value| send("#{name}=", value) }
end
...
Ожидаемый результат (в разработкеmode is)
"development mode "
"before extend"
[
[0] ActiveModel::Validations::HelperMethods,
[1] ActiveSupport::Callbacks,
[2] ActiveModel::Validations,
[3] ActiveModel::Conversion,
[4] GCLI,
[5] GrumplesUtility,
[6] ActiveSupport::Dependencies::Loadable,
[7] JSON::Ext::Generator::GeneratorMethods::Object,
[8] PP::ObjectMixin,
[9] Kernel
]
"after Buildable extend"
[
[ 0] Buildable,
[ 1] ActiveModel::Validations::HelperMethods,
[ 2] ActiveSupport::Callbacks,
[ 3] ActiveModel::Validations,
[ 4] ActiveModel::Conversion,
[ 5] GCLI,
[ 6] GrumplesUtility,
[ 7] ActiveSupport::Dependencies::Loadable,
[ 8] JSON::Ext::Generator::GeneratorMethods::Object,
[ 9] PP::ObjectMixin,
[10] Kernel
]
Затем, когда точно такой же код выполняется в рабочем режиме:
"production mode "
"before extend"
[
[ 0] ActiveModel::Validations::HelperMethods,
[ 1] ActiveSupport::Callbacks,
[ 2] ActiveModel::Validations,
[ 3] ActiveModel::Conversion,
[ 4] GCLI,
[ 5] Deployable,
[ 6] GrumplesUtility,
[ 7] ActiveSupport::Dependencies::Loadable,
[ 8] JSON::Ext::Generator::GeneratorMethods::Object,
[ 9] PP::ObjectMixin,
[10] Kernel
]
"after Buildable extend"
[
[ 0] Buildable,
[ 1] ActiveModel::Validations::HelperMethods,
[ 2] ActiveSupport::Callbacks,
[ 3] ActiveModel::Validations,
[ 4] ActiveModel::Conversion,
[ 5] GCLI,
[ 6] Deployable,
[ 7] GrumplesUtility,
[ 8] ActiveSupport::Dependencies::Loadable,
[ 9] JSON::Ext::Generator::GeneratorMethods::Object,
[10] PP::ObjectMixin,
[11] Kernel
]
Я обнаружил, что модуль Deployable уже был вставлен в список singleton_class. Помимо того, что его там не должно быть, он реализует тот же интерфейс, что и Buildable, который затем превосходит Buildable и вместо этого запускает версию Deployable, которая неверна.
Я не могу найти, как и когда вставляется модуль Deployableв рабочем режиме, но не в режиме разработки.
Буду признателен за помощь в выяснении, почему он работает в режиме разработки, а не в рабочем режиме.