2010-03-24 1 views
2

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

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

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) 
+0

Не следует. Кажется, что-то вроде перезагрузки! продолжается. Трудно сказать без полного исходного кода ... –

+0

Я предполагаю, что вы полностью сериализуете объект телеграммы в сеанс, а затем восстанавливаете его. Это может быть сложной задачей. – Tilendor

+0

Хм, любые предложения о том, где и что искать, если это так? – CambridgeMike

ответ

1

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

+0

Интересное предложение. Я думаю, проблема немного сложнее, чем я допускаю. CartItem на самом деле является базовым классом для STI, поэтому, когда у меня есть подкласс A CambridgeMike

1

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

Смежные вопросы