Rails: Retrieved Object не имеет атрибутов и не сопоставим с реальным - PullRequest
0 голосов
/ 04 февраля 2009

Эта проблема действительно теряет меня.

У меня есть модель для аутентификации: пользователь. У меня есть модель для комментариев: комментарий. У меня есть модель, которая комментируется: weburl.

Weburl 1 .. * Комментарий Weburl * .. 1 пользователь Комментировать * .. 1 пользователь

Проблема, с которой я столкнулся, не подлежит тестированию (все мои тесты проходят успешно) и не возникает постоянно. Обычно это происходит во второй раз, когда я генерирую такое же действие контроллера.

Проблема - это мой пользователь, связанный с моим комментарием, и извлекаемый через comment.user становится НЕ РАВНЫМ для current_user, даже если атрибуты совпадают. Например:

(comment.user.login == current_user.login == User.find(1).login)
     ==> True
(comment.user.id)
     ==> Unknown in the current context
(comment.user.class == User == current_user.class)
     ==> True 

Я дважды проверил отношения belongs_to и has_one has_many в моих моделях

Я предполагаю, что это связано с кэшированием, я испытываю это в своей среде разработки, но не в своих автоматических тестах и ​​не в производстве.

Я бы хотел понять, в чем проблема.

Спасибо

EDIT Добавление моего init.rb файла development.rb

config.cache_classes = false                                    #Set to true for prod
config.whiny_nils = true
config.action_controller.consider_all_requests_local = true     #Set to false for prod
config.action_view.debug_rjs                         = true
config.action_controller.perform_caching             = false    #Set to true for prod

РЕДАКТИРОВАТЬ # 2 Если config.cache_classes равен true, ошибка не происходит

Док говорит: # В среде разработки код вашего приложения перезагружается при каждом запросе. Это замедляет время отклика, но идеально подходит для разработки, поскольку вам не нужно перезагружать веб-сервер при внесении изменений в код.

нашел следующий билет, возможно, взаимосвязан http://dev.rubyonrails.org/ticket/10722 Также проблема возникает с Mongrel и WebRick.

Ответы [ 3 ]

1 голос
/ 05 февраля 2009

Я думаю, что вы имеете в виду из своего вопроса: почему это не работает: comment.user == current_user.

Когда вы сравниваете два объекта Ruby друг с другом, т.е. comment.user == current_user вы сравниваете их ссылки, поскольку они являются двумя уникальными объектами и расположены в разных областях памяти, это правильное поведение.

Вместо этого вам придется сравнивать некоторые другие уникальные поля, такие как логин или идентификатор.

0 голосов
/ 03 января 2013

У меня была похожая проблема, и я решил ее, сбросив и перечитав базу данных.

0 голосов
/ 05 февраля 2009

Какая именно ошибка выдается здесь: (comment.user.id)? Если вы не можете получить доступ к объекту User из объекта Comment, возможно, вам что-то не хватает в модели. Я не близко к консоли, чтобы проверить это, хотя

...