如何在Rails控制台中重新加载模型?

11
> 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验证对象已更改。

重新加载Rails控制台中的模型的最佳方法是什么?每次更改模型代码时都必须重新启动控制台吗?有没有一种方法可以仅转储所有现有模型及其代码而不重新加载控制台?

编辑:这变得更加奇怪了。我现在怀疑我的代码已经重新加载,但调试器并未反映出新代码。当我逐步执行代码时,旧代码会出现,但会执行新代码。我通过添加raise进行了测试--raise从未在调试器中显示,但确实被引发了。怎么回事?

是否需要在调试器中做些什么才能看到重新加载的代码?这看起来像一个bug...


1
你是在尝试在类本身上调用方法还是在类的实例上调用方法? - Chris Schmitz
@ChrisSchmitz类的实例;我正在阅读关于使用self并且通过修改代码来理解它。 - jcollum
有几个不同的Ruby调试器,指定你正在使用哪一个会很有帮助。 - Andrew Marshall
@AndrewMarshall 我的 Gemfile 中有 ruby-debug-base19xruby-debug19 -- 最近我在使用调试器和 linecache 时遇到了一些问题,所以它们可能都在那里。 - jcollum
1个回答

25

reload! 不会重新初始化现有的对象,它只是重新加载代码。如果您创建了该类的新实例,则应该反映更改。


这在 OP 中已经讲过了,也许我创建对象的方式不是你想的那样?我是通过从数据库中加载它来创建它的:p = Product.by_name 'Acme Mop' -- 这会调用 Product.where(name: name).first -- 这可能是问题所在吗? - jcollum
@jcollum他并不是在说创建对象的方式很重要,而是时间很重要。你是在调用reload!之前还是之后创建对象? - Andrew Marshall
@AndrewMarshall 再次提醒,这已经在 OP 中讨论过了。我在调用 reload! 后从数据库中加载对象,但代码更改并没有反映在对象中。 - jcollum
@AndrewMarshall 我认为这可能是调试器的问题 - 请看我的编辑。 - jcollum
1
@jcollum 很好的问题!我编写 Ruby 已经超过 10 年了,但我从来没有真正思考过这个问题。通常,在你的例子中,我会尝试在我的对象上使用 reload! 和 instance.reload,有时它似乎有效,有时则不然。然后我会重新启动控制台,那样总是有效的。所以我试图弄清楚,Chris 是对的。如果你正在使用一个类的实例,则重新加载确实重新加载了除实例之外的所有内容(这很有道理)。因此,如果你在重新加载后进行实例化,则它将具有新代码。谢谢。现在我不需要不必要地输入 reload 了。 - Carson Cole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接