Вопрос

Мы продолжаем видеть предупреждения, подобные следующим, когда запускаем наши спецификации:

Идентификатор объекта # устареет;использовать объект#object_id

Код, о котором идет речь, обращается к идентификатору модели ActiveRecord (который, очевидно, является атрибутом в таблице, а не идентификатором экземпляра объекта в виртуальной машине Ruby).

Кто-нибудь знает, как отключить эти конкретные предупреждения или каким-то образом избежать их?

Это было полезно?

Решение

Я предполагаю, что вы делаете mocking / stubbing (потому что вы упомянули спецификации).

В моем случае я сталкиваюсь с этими предупреждениями, когда заглушаю объект ActiveRecord и получаю доступ к его атрибуту ID.

В случаях, когда вы ожидаете получить доступ к идентификатору вашего объекта ActiveRecord, я бы рекомендовал вам сделать следующее:

 mock("MyActiveRecordObject", :id => 1001)

Другие советы

Попробуйте использовать [:id] вместо того, чтобы .id

Когда объект происходит от ActiveRecord::Base, призыв к id переходит к AR::B's id метод, а не устаревший на Object.

Это предупреждение обычно означает, что один из моих объектов не такой, как я думаю.

Ваш объект на самом деле не является объектом AR, что обычно указывает на сбой при извлечении некоторых данных (Table.find_by_name('nonexistent name') вернется nil).Если все, что вы хотите сделать, это отключить видимые предупреждения, вы можете отключить whiny_nils в вашей конфигурации, в противном случае выполните is_a? проверьте, прежде чем пытаться получить доступ к атрибутам объекта, и корректно обработайте случай сбоя.

Предупреждение object#id появляется только в обычных классах ruby, таких как NilClass.ActiveRecord::Base переопределяет идентификатор объекта #

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top