Rails: класс 'object_id изменяется после того, как я сделаю запрос - PullRequest
2 голосов
/ 24 марта 2010

Я действительно не могу объяснить это поведение, обратите внимание, как после того, как я сделаю запрос, идентификатор объекта класса изменился, и, следовательно, мой is_a? оценка возвращает ложь.

есть идеи? Я даже не уверен, как это отладить. Кроме того, это не связано с выполнением запроса из командной строки. Такое же поведение проявляется и на веб-сервере, его проще объяснить из командной строки.

staging$ RAILS_ENV=staging script/console
Loading staging environment (Rails 2.3.2)
>> c = CartItem.new
=> #<CartItem id: nil, order_id: nil, order_source: nil, date: nil, user_id: nil, created_at: nil, updated_at: nil, paid: nil, payment_id: nil, values: nil, cart_description: nil, type: nil, price: nil, email: nil, error: nil>
>> c.class.object_id
=> 70151495336400
>> CartItem.object_id
=> 70151495336400
>> c.is_a? CartItem
=> true
>> app = ActionController::Integration::Session.new
=> #<ActionController::Integration::Session:0x7f9ad5c55db0 .... >
>> app.get("site/favorite")
=> 200
>> c.class.object_id
=> 70151495336400
>> CartItem.object_id
=> 70151496019760
>> c.is_a? CartItem
=> false
>> c.class
=> CartItem(id: integer, order_id: string, order_source: string, date: date, user_id: integer, created_at: datetime, updated_at: datetime, paid: boolean, payment_id: integer, values: text, cart_description: string, type: string, price: integer, email: string, error: string)

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Поскольку модуль ActionController::Integration используется для интеграционного тестирования, get ссылка на URL перезагружает ваши классы, поэтому переопределяет идентификатор CartItem. Теперь у вас есть в основном два класса CartItem, один из которых висит в вашем стеке без идентификатора, указывающего на него («старый»), и один, на который ссылается идентификатор CartItem.

1 голос
/ 24 марта 2010

Каждый новый контекст (цикл запроса / ответа) будет восстанавливать идентификаторы объекта. Вы можете использовать responds_to? вместо is_a?.

...