2012-05-05 3 views
6
> rvm list 
rvm rubies 

=* ruby-1.9.2-p290 [ i686 ] 
    ruby-1.9.3-p194 [ i686 ] 

> rails -v 
Rails 3.1.1 

Связанные, но не ответил: Is there a Rails Console command (Rails 3+) to reload changed code?Как перезагрузить модель в консоли rails?

Я использую Рельсы консоли, чтобы попытаться выяснить, почему метод в моей модели не вызывается. Модель находится в ./app/models/product.rb. Я меняю метод на вызов self.trim_history на trim_history. Я все еще обволакиваю голову, когда называть метод self.do_stuff или просто do_stuff.

Ну, в процессе выяснения этого я столкнулся с проблемой с reload!. Я понял, что reload! снова загрузит все модели и контроллеры, но это, похоже, не работает. Когда я отлаживаю свой код, строка, которую я изменил, была do_stuff, по-прежнему отображается как self.do_stuff в отладчике.

Я попытался решить это с помощью reload!, без исправления. Я перезагрузил объект из базы данных после перезагрузки, без исправления. Я загрузил модель напрямую с load './app/models/product.rb', затем загрузил объект из базы данных, без исправления. Я проверил, что объект изменяется с помощью tail.

Каков наилучший способ перезагрузить модель в консоли рельсов? Должен ли я перезапускать консоль каждый раз, когда меняет код модели? Есть ли способ просто сбрасывать все существующие модели и их код без перезагрузки консоли?

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

Есть ли что-то, что мне нужно для работы с отладчиком, чтобы получить его, чтобы увидеть перезагруженный код? Это выглядит как ошибка ...

+1

Вы пытаетесь вызвать метод для самого класса или экземпляра класса? –

+0

экземпляр @ChrisSchmitz класса; Я читаю об использовании себя и возиться с кодом, пока не пойму. – jcollum

+0

Существует несколько различных отладчиков для Ruby, было бы полезно указать, какой из них вы используете. –

ответ

16

reload! не повторно инициализирует существующие объекты, он просто перезагружает код. Если вы создаете новый экземпляр класса, он должен отражать изменения.

+0

это описано в ОП, возможно, я не создаю объект так, как вы думаете? Я создаю его, загружая его из db: 'p = Product.by_name 'Acme Mop'' - это вызов' Product.where (name: name) .first' - это может быть проблемой? – jcollum

+0

@jcollum Он не говорит, что * как * они созданы релевантно, а скорее * когда *. Вы создаете объекты до или после вызова 'reload!'? –

+0

@AndrewMarshall снова, покрытый OP. Я загружаю объект из db после вызова 'reload!', И изменения кода не отражаются в объекте – jcollum

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