辅助方法不会通过 rails 控制台中的 `reload!` 重新加载

iro*_*and 1 ruby-on-rails helper rails-console

我有一个这样的辅助方法:

module PostsHelper
  def foo
    "foo"
  end
end
Run Code Online (Sandbox Code Playgroud)

在 rails 控制台中,我检查了函数,然后将文本更改"foo""bar",然后reload!是控制台,但helpers.foo仍然没有返回"bar"

也许 Helper 对象已经像这篇文章一样在控制台中创建了,我不确定。 Rails 控制台:重新加载!不反映模型文件的变化?可能的原因是什么?

只有我想知道如何在 rails 控制台中使用 helper 方法。你能告诉我怎么做吗?

Cha*_*man 5

你是正确的,helper代表一个已经实例化的对象,因此不受调用的影响reload!helper控制台中的方法定义为:

def helper
  @helper ||= ApplicationController.helpers
end
Run Code Online (Sandbox Code Playgroud)

第一次调用时helper,它会记住ApplicationController助手。当您调用 时reload!ApplicationController类(及其助手)会重新加载,但该helper方法仍在查看旧实例。

不使用helper方法,ApplicationController.helpers直接调用即可,运行后你会看到你的变化reload!

> helper.foo
# => "foo"
> ApplicationController.helpers.foo
# => "foo"
> # Change the return value of PostsHelper from "foo" to "bar"
> reload!
> helper.foo
# => "foo"
> ApplicationController.helpers.foo
# => "bar"
Run Code Online (Sandbox Code Playgroud)

编辑

从 Rails 5 开始,这将不再是问题。合并了一个PR以从helper控制台方法中删除记忆。