Контент Rails 4.2 игнорируется в тестовой среде

Я застрял в действительно странной проблеме. Недавно я обновился с рельсов 4.1 до 4.2. В 4.1 все работало нормально. Но теперь, в версии 4.2, кажется, что содержимое проблемы с моделью игнорируется, даже если проблема найдена.

Проще говоря. У меня есть модель Client, которая принадлежит отношению Address, которое определено в отношении Addressable:

приложение/models/client.rb

class Client < ActiveRecord::Base
  include Addressable
end

приложение/models/address.rb

class Address < ActiveRecord::Base
end

приложение/модели/концерны/addressable.rb

module Addressable
  extend ActiveSupport::Concern

  included do
    belongs_to :address
  end

Нет проблем в среде development. Я могу сделать Client.new.address без проблем. Но в среде test эта же строка выдает ошибку unknow method address. Если я перемещу belongs_to :address в Client, он снова заработает. Модуль включается, потому что ошибки по этому поводу нет, а если я поменяю имя на Adressabledewdewded то, естественно, будет ошибка.

То же самое происходит с методами проверки и т. д.

Я отлаживаю это, но не нахожу корень. Я скопировал свой development.rb как test.rb и перезапустил сервер, но все же. Я не могу воспроизвести это в только что новом приложении Rails 4.2, поэтому это должно иметь какое-то отношение к моему приложению или процессу обновления, но не знаю, где.

Кто-нибудь знает?

Спасибо

ОБНОВЛЕНИЕ

Это трассировка стека при выполнении Client.new.address в консоли в тестовой среде (в разработке это работает):

NoMethodError: undefined method `address' for #<Client:0xbc89dac0>
    from /home/marc/.gem/ruby/2.1.3/gems/activemodel-4.2.0/lib/active_model/attribute_methods.rb:433:in `method_missing'
    from (irb):3
    from /home/marc/.gem/ruby/2.1.3/gems/railties-4.2.0/lib/rails/commands/console.rb:110:in `start'
    from /home/marc/.gem/ruby/2.1.3/gems/railties-4.2.0/lib/rails/commands/console.rb:9:in `start'
    from /home/marc/.gem/ruby/2.1.3/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /home/marc/.gem/ruby/2.1.3/gems/railties-4.2.0/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /home/marc/.gem/ruby/2.1.3/gems/railties-4.2.0/lib/rails/commands.rb:17:in `<top (required)>'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `block in require'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require'
    from /home/marc/projects/clients_webs/a_project/bin/rails:8:in `<top (required)>'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `block in load'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /home/marc/.gem/ruby/2.1.3/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:268:in `load'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/commands/rails.rb:6:in `call'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/command_wrapper.rb:38:in `call'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:183:in `block in serve'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:156:in `fork'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:156:in `serve'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:131:in `block in run'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:125:in `loop'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application.rb:125:in `run'
    from /home/marc/.gem/ruby/2.1.3/gems/spring-1.3.1/lib/spring/application/boot.rb:18:in `<top (required)>'
    from /home/marc/.rubies/ruby-2.1.3/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from /home/marc/.rubies/ruby-2.1.3/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'

ОБНОВЛЕНИЕ

Результат Client.ancestors в обеих средах (конечно, без единственной разницы в идентификаторе экземпляра):

 => [Client (call 'Client.connection' to establish a connection), Trader, Addressable, Kaminari::ConfigurationMethods, Kaminari::ActiveRecordModelExtension, Client::GeneratedAssociationMethods, #<#<Class:0xba3b1c70>:0xba3b1d24>, ActiveRecord::Base, Kaminari::ActiveRecordExtension, GlobalID::Identification, ActiveRecord::Store, ActiveRecord::Serialization, ActiveModel::Serializers::Xml, ActiveModel::Serializers::JSON, ActiveModel::Serialization, ActiveRecord::Reflection, ActiveRecord::NoTouching, ActiveRecord::Transactions, ActiveRecord::Aggregations, ActiveRecord::NestedAttributes, ActiveRecord::AutosaveAssociation, ActiveModel::SecurePassword, ActiveRecord::Associations, ActiveRecord::Timestamp, ActiveModel::Validations::Callbacks, ActiveRecord::Callbacks, ActiveRecord::AttributeMethods::Serialization, ActiveRecord::AttributeMethods::Dirty, ActiveModel::Dirty, ActiveRecord::AttributeMethods::TimeZoneConversion, ActiveRecord::AttributeMethods::PrimaryKey, ActiveRecord::AttributeMethods::Query, ActiveRecord::AttributeMethods::BeforeTypeCast, ActiveRecord::AttributeMethods::Write, ActiveRecord::AttributeMethods::Read, ActiveRecord::Base::GeneratedAssociationMethods, #<#<Class:0xb8df1c14>:0xb8df1c50>, ActiveRecord::AttributeMethods, ActiveModel::AttributeMethods, ActiveRecord::Locking::Pessimistic, ActiveRecord::Locking::Optimistic, ActiveRecord::AttributeDecorators, ActiveRecord::Attributes, ActiveRecord::CounterCache, ActiveRecord::Validations, ActiveModel::Validations::HelperMethods, ActiveSupport::Callbacks, ActiveModel::Validations, ActiveRecord::Integration, ActiveModel::Conversion, ActiveRecord::AttributeAssignment, ActiveModel::ForbiddenAttributesProtection, ActiveRecord::Sanitization, ActiveRecord::Scoping::Named, ActiveRecord::Scoping::Default, ActiveRecord::Scoping, ActiveRecord::Inheritance, ActiveRecord::ModelSchema, ActiveRecord::ReadonlyAttributes, ActiveRecord::Persistence, ActiveRecord::Core, Object, PP::ObjectMixin, ActiveSupport::Dependencies::Loadable, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]

И выполнение Client.reflections.keys приводит к тому, что address появляется в разработке, но не в тесте.


person Waiting for Dev...    schedule 13.02.2015    source источник
comment
Не могли бы вы добавить полную трассировку стека возникновения ошибки, а также тест, в котором возникает ошибка?   -  person janfoeh    schedule 13.02.2015
comment
Привет @janfoeh. Нет необходимости тестировать, чтобы воспроизвести это в моем приложении. Простое открытие консоли в тестовой среде и выполнение Client.new.address приводит к ошибке undefined method address. Я редактирую ответ, чтобы добавить трассировку стека, но боюсь, это совершенно бесполезно.   -  person Waiting for Dev...    schedule 13.02.2015
comment
Вы правы, это делает вопрос спорным. Извините, я пропустил это. Можете ли вы запустить Client.ancestors как в консоли разработки, так и в тестовой консоли и посмотреть, присутствует ли модуль Adressable в обеих?   -  person janfoeh    schedule 13.02.2015
comment
Спасибо @janfoeh. В обоих случаях появляется Addressable... Я обновляю вопрос его выводом.   -  person Waiting for Dev...    schedule 13.02.2015
comment
Хм. Client.reflections позволяет вам проверять ассоциации, а Client.reflections.keys дает вам только имена. Можете ли вы найти разницу между обеими средами?   -  person janfoeh    schedule 13.02.2015
comment
Да, address появляется в разработке, но не в тесте :)   -  person Waiting for Dev...    schedule 13.02.2015
comment
Мне очень жаль, но я в растерянности. Далее я бы установил отладчик (отладчик для Ruby 1.x, byebug для Ruby 2.x), установил точку останова перед belongs_to и прошел через нее в обеих средах.   -  person janfoeh    schedule 13.02.2015
comment
Да, видел, но ничего не понятно. В любом случае, большое спасибо @janfoech   -  person Waiting for Dev...    schedule 13.02.2015
comment
@janfoeh Я понял :) Если вам интересно, в чем причина, прочитайте мой ответ)   -  person Waiting for Dev...    schedule 13.02.2015
comment
Хороший улов и хорошее напоминание для меня о пространстве имен моих проблем. Я искренне хотел бы, чтобы они были по умолчанию.   -  person janfoeh    schedule 13.02.2015


Ответы (1)


Я понял. Дело в том, что гем, присутствующий только в моем тестовом окружении (json-schema), имеет между своими зависимостями гем addressable, определяющий Addressable модуль. Поэтому, когда Rails пытается автозагрузить Addressable, он находит класс, определенный addressable, вместо моего класса ответственности. Так что, конечно, модуль включается, но это не тот, который я думал.

При обновлении моего Gemfile json-schema был обновлен и теперь зависит от addresable, с ноября 2014.

Трудно поймать это :)

person Waiting for Dev...    schedule 13.02.2015
comment
Я уже час бился головой о стену с точно такой же проблемой, спасибо за публикацию решения! - person DaveStephens; 09.06.2015